Espera pela entrada do teclado dentro de um loop de leitura de tempo

0

Eu tenho um script bash com uma construção como esta:

while read foo bar baz;
do
    echo "Processing $foo $bar $baz"
    # more code here
done < /etc/somefile

Dentro do loop, eu gostaria que o script esperasse pela entrada do teclado (basicamente apenas "pressione Enter para continuar". No entanto, o seguinte código dentro do loop

echo "Press [ENTER] to continue"
read -s

não faz com que o script pare por aí; aparentemente, ele recebe a entrada do arquivo fornecido em vez do teclado. Como posso forçá-lo a ler no teclado?

    
por user149408 21.05.2018 / 19:04

2 respostas

2

O seguinte código /bin/sh abre o descritor de arquivos 3 como uma cópia da entrada padrão. Dentro do loop, o read keypress lê esse novo descritor de arquivo e não o arquivo alimentado no próprio loop. No final, o descritor de arquivo é explicitamente fechado.

exec 3<&0
while read -r foo bar baz; do
    printf 'Processing %s, %s and %s\n' "$foo" "$bar" "$baz"
    printf 'Press <enter> to continue: ' >&2
    read keypress <&3
done <file
exec 3<&-

echo 'Done.'

Isso permite que você use, por exemplo,

yes | ./script.sh

para "pressionar automaticamente enter " em cada prompt.

    
por 21.05.2018 / 19:15
0

A alimentação de um arquivo no loop afetará cada instância de read no loop, a menos que explicitamente especificado de outra forma. O seguinte trabalhou:

echo "Press [ENTER] to continue"
read -s < /dev/tty
    
por 21.05.2018 / 19:04