Estou tendo um script bash que é algo como seguir,
cat filename | while read line
do
read input;
echo $input;
done
mas isso claramente não está me dando a saída correta, já que quando eu leio no loop while, ele tenta ler o nome do arquivo por causa do possível redirecionamento de E / S.
Alguma outra maneira de fazer o mesmo?
bash
while-loop
w2lame
fonte
fonte
Respostas:
Leia a partir do dispositivo terminal de controle:
mais informações: http://compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop
fonte
bash yourscript < /foo/bar
irá aguardar a entrada do usuário, isso é aceitável apenas ao ler senhas. A resposta de @GordonDavisson é preferível para todos os outros usos.Você pode redirecionar o stdin regular através da unidade 3 para mantê-lo dentro do pipeline:
BTW, se você realmente está usando
cat
dessa forma, substitua-o por um redirecionamento e as coisas se tornam ainda mais fáceis:Ou você pode trocar stdin e unidade 3 nessa versão - leia o arquivo com a unidade 3 e apenas deixe stdin sozinho:
fonte
read line
está lendo a partir de notificação concluída, mas se você apenas executá-lo conformeread -u 3 input
está escrito, ele está lendo no console)?Tente mudar o loop assim:
Teste de unidade:
fonte
Parece que você leu duas vezes, a leitura dentro do loop while não é necessária. Além disso, você não precisa invocar o comando cat:
fonte
read
comportamento do interno como "incorreto [porque] ele tenta ler o arquivofilename
") e na resposta aceita.Encontrei este parâmetro -u com read.
"-u 1" significa "ler de stdin"
fonte
fonte