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

7

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

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

a execução não faz uma pausa como se a leitura estivesse fora do loop. Por que é isso? Existe uma solução alternativa para a leitura de entrada dentro de um loop de leitura?

    
por Charlotte 07.05.2012 / 21:36

4 respostas

9

O problema é que read line e read response esperam (e obtêm) dados de stdin .
Esta questão no SO explica algumas delas com um link para ainda mais informações.

tl; dr
A resposta aceita sugere:

Read from the controlling terminal device: read input </dev/tty

    
por 07.05.2012 / 21:44
10

deixe o comando inner read 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
    
por 07.05.2012 / 21:50
1

O nifle está exatamente correto. Quando você está usando vários terminais, no entanto, 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 de usuário durante um loop de leitura while (isso inclui rm -i , read , ou qualquer outra coisa), você pode especificar qual pipe 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
    
por 26.05.2014 / 20:42
0

Obrigado Nifle! E também graças ao bgStack. Depois de procurar por horas eu finalmente consegui a resposta! Muito bom!! Eu usei "echo $ (tty)" para detectar o caminho do meu terminal ou você simplesmente o considera variável. Para mim, foi outro caso de uso. U 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
    
por 08.05.2015 / 20:13

Tags