O problema urgente de ler a entrada do teclado no pipeline é resolvido pela resposta em https://stackoverflow.com/questions/15230289/read-keyboard-input-within-a-pipelined-read-loop :
mycommand-outputpiped | while read line
do
# do stuff
read confirm < /dev/tty
done
Por que funciona? Não tty
redireciona para a entrada padrão? Posso obter um descritor de arquivo /dev/tty
e usá-lo read -u fd
em vez disso? TIA
Isso funciona porque
/dev/tty
é o terminal de controle, se houver, e ao redirecionar a partir dele você garanteread
leituras a partir dele, em vez de qualquer entrada padrão anterior ao redirecionamento. Se você não fizesse isso,read
leria a partirmycommand-outputpiped
da saída de .A entrada padrão de um programa é, inicialmente, o que seu processo pai decidir que deve ser. Ao iniciar um processo a partir de um shell em um terminal, sem redirecionamento, esse será o terminal de controle do shell; mas qualquer redirecionamento da entrada padrão o substitui.
Ao redirecionar a entrada padrão de ,
/dev/tty
você obtém um descritor de arquivo para ela, 0; mas, comoread
lê a partir dele por padrão,-u
não é útil. Não há outro descritor de arquivo que aponte para/dev/tty
. Em muitos shells, você poderia abrir explicitamente um descritor de arquivo diferente, mas neste cenário não há muita razão para isso.