
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 line
esperam 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