Capturando a entrada do usuário sem exigir “Enter”

1

Eu tenho a seguinte tarefa:

Os scripts solicitam parâmetros do usuário e, no final, executam um determinado comando com base nesses parâmetros. (Imagine o script, que solicita primeiro o nome do arquivo, depois os argumentos para o chmod ).

O problema é que o script deve ser terminado por uma certa sequência de teclas (como quando o usuário digita parar sem entrar, ao invés de, por exemplo, Ctrl - C ).

    
por rkhunter 10.06.2017 / 12:33

2 respostas

1

Você pode usar read com -n 1 para ler caractere por caractere e criar a string que você leu à medida que avança. Então você pode decidir o que fazer com cada caractere:

val=""
while read -n 1 char; do
    if [[ $char = "" ]]; then
        printf 'Got an enter and the string is %s' "$val"
        # do whatever else you want with it here
        val="" # reset it to get the next param
    else
        val="$val$char" # append input
    fi
    if [[ $val = "halt" ]]; then
        exit
    fi
done
    
por 10.06.2017 / 13:30
0

Dada a descrição da tarefa, você não deve manipular caracteres de entrada por caractere. Lendo linha por linha está bem. Ler personagem por personagem não irá ajudá-lo.

Se você não precisa fazer nada em Ctrl + C além de sair do script, não faça nada. Esse é o comportamento padrão.

Se você precisar executar algum código customizado em Ctrl + C (que pode ou não terminar encerrando o script), há um mecanismo interno no driver de terminal. Pressionar esta tecla envia o sinal SIGINT . No shell, defina um trap para o sinal.

cleanup () {
  … whatever you need to do before the script exits …
}
trap 'echo >&2 "Aborting"; cleanup; exit 130' INT
while IFS= read -r line; do
  …
done
    
por 11.06.2017 / 01:48