ler uma tecla do teclado dentro enquanto lê

4

Eu tenho um script que procura alguns arquivos, alguns deles com espaços em branco, e devido a isso estou usando while read . Dentro de tal loop eu preciso usar ler -p "Pause" para esperar por uma chave em cada interação. No entanto, em vez de esperar por uma chave, está lendo a primeira letra do pipeline. Eu preciso de algo assim:

find . -name "*.o3g" | grep "pattern" | while read line
do
    process "$line"
    read -p "Press any key to continue"
done
    
por Hola Soy Edu Feliz Navidad 26.06.2017 / 13:30

1 resposta

2

Como você já está usando o código bash específico, faça (assumindo o GNU grep ou compatível):

find . -name '*.o3g' -print0 | grep -z pattern |
  while IFS= read -rd '' file; do
    process "$file"
    read -n1 -p 'Press any key to continue' < /dev/tty
  done

(onde o caractere (observe que algumas chaves enviam mais de um caractere) é lido no terminal de controle).

Ou, melhor, porque isso também evita que stdin de process seja o canal de grep :

while IFS= read -u 3 -rd '' file; do
  process "$file"
  read -n1 -p 'Press any key to continue'
done 3< <(find . -name '*.o3g' -print0 | grep -z pattern)

(onde o caractere é lido do stdin não modificado).

Veja também Por que o loop é uma má prática de saída? para outros possíveis problemas com a maneira como você processa find output.

Aqui, talvez você possa simplesmente fazer:

find . -name '*.o3g' -path '*pattern*' -ok process {} \;

Veja também, para evitar qualquer GNUism exceto o bash :

find . -name '*.o3g' -exec bash -c '
  for file do
    [[ $file =~ pattern ]] || continue
    process "$file"
    read -n1 -p "Press any key to continue"
  done' bash {} +
    
por 26.06.2017 / 13:52