Bash: a leitura da entrada enquanto o loop de leitura não funciona

Bash: a leitura da entrada enquanto o loop de leitura não funciona

Ler a entrada dentro de um loop while read não parece funcionar

while read line
do
 echo "get some input from the user"
 read response
done < some_file.txt

a execução não pausa como faria se a leitura estivesse fora do loop. Por que é isso? Existe uma solução alternativa para ler a entrada em um loop while read?

Responder1

O problema é que ambos read lineesperam read response(e obtêm) dados do stdin.
Essa questãono SO explica parte disso com um link para ainda mais informações.

dr.
A resposta aceita sugere:

Leia do dispositivo terminal de controle:read input </dev/tty

Responder2

deixe o comando de leitura interno usar stdin e use um descritor de arquivo diferente para o loop while

while read -u 3 line; do
  read -p "get some input from the user" response
done 3< some_file.txt

Responder3

Obrigado Nifle! E também graças ao bgStack. Depois de procurar por horas finalmente consegui a resposta! Muito bom!! Usei "echo $(tty)" para detectar o caminho do meu terminal ou você apenas o considera uma variável. Para mim foi outro caso de uso. Você estava lendo um arquivo e gostaria de confirmar a execução. Talvez o exemplo abaixo ajude alguém.

#!/bin/bash

export terminal=$(tty)

cat file | while read val1 val2
do
   while true; 
            do
              read -p "would you like to XYZ" yn
              case $yn in
                        [Yy]* )     echo "# Move $val1 to $val2        #";break;;
                        [Nn]* )     echo "#---------no action----------#";break;;
                        * )         echo "# Please answer yes or no.   #";;
              esac
            done < $terminal
done

Responder4

Nifle está exatamente certo. Ao usar vários terminais, entretanto, você precisa ser específico.

Para aqueles que vêm do Google, parabéns por encontrar esta página. Se você precisar fazer qualquer entrada do usuário durante um loop de leitura while (isso inclui rm -i, read, ou qualquer outra coisa), você pode especificar qual canal de entrada usar.

Aqui está um fragmento desta solução que usei:

#in declarations
thistty=$(tty)

lsuser -R LDAP -a home pgrp ALL 2>/dev/null | while read line
do
   homedir=$(echo $homedir | awk -F= '{print $2}')
   sudo rm -ir "$homedir" < $thistty
done

informação relacionada