Framework para script de shell interativo (bash)

1

Meu projeto atual executa um sistema de testes em uma caixa linux (com 9 telas ativas)

Toda a equipe está familiarizada com a forma de dar início a um teste & c. mas menos familiarizado com os comandos para verificação de progresso, movimentação de arquivos, parada forçada do teste, etc.

Eu gostaria de escrever um script que possa reunir verificações úteis, chutando-as com um simples pressionamento de tecla. Eu poderia fazer isso em Perl com muita facilidade, mas mais consistente se fosse um script de shell (bash).

No entanto, minha experiência com o shell é limitada e gostaria de um exemplo de script (por exemplo, um framework) que seria fácil para outros estenderem.

Wait for Key
Perform action
  Possibly accept further input for action
Repeat

Um bônus seria executar uma ação a cada n minutos se nenhuma chave fosse recebida.

    
por itj 09.07.2010 / 10:58

3 respostas

6

Com base no que você está descrevendo, aqui está algo simples (graças aos comentários de Dennis):

while true; do
    # 300 is the time interval in seconds
    if read -n 1 -t 300; then
        case $REPLY in
        a)
            # command(s) to be run if the 'a' key is pressed
            echo a;;
        b)
            # command(s) to be run if the 'b' key is pressed
            echo b;;
        esac
    else
        # command(s) to be run if nothing is pressed after a certain time interval
        echo
    fi
done

Aqui está a alternativa que eu tinha antes, embora eu não consiga lembrar por que eu decidi contra case em primeiro lugar:

# define functions here
a_pressed() {
    # command(s) to be run if the 'a' key is pressed
}

b_pressed() {
    # commands for if 'b' is pressed
}

# etc.

nothing_pressed() {
    # command(s) to be run if nothing is pressed after a certain time interval
}

while true; do
    # 300 is the time interval in seconds
    if read -n 1 -t 300; then
        fn_name="${REPLY}_pressed"
        declare -pF | grep -q "$fn_name" && ${fn_name}
    else
        nothing_pressed
    fi
done

De qualquer forma, isso manipulará pressionamentos de tecla e invocará automaticamente uma ação sempre que nada for feito por 5 minutos.

    
por 09.07.2010 / 11:22
1

Os únicos que eu já ouvi falar são o Bashinator e o NRG Framework

NRG

Bashinator

    
por 09.07.2010 / 11:08
1

Graças a David Zaslavsky - faz o que eu quero.

Sugestões de ajustes (não consigo editar a resposta) ou formatar comentários

Adicionar tipo de shell

#!/bin/bash 

Parametrizar tempo e permitir prompt (mas não no tempo limite). Também parece que o N deveria ter sido -n

# Will wait for this interval, then run default action 
DELAY=30 
while true; do 
    echo "Command list here..." 
    while true; do 
        if read -n 1 -t ${DELAY}; then 
            fn_name="${REPLY}_pressed" 
            declare -pF | grep -q "$fn_name" && ${fn_name} 
            break 
        else 
            default_action 
        fi 
    done 
done 
    
por 09.07.2010 / 12:37