Como você pode solicitar a entrada de um usuário, quando a saída está sendo canalizada?
> (echo -n 'input data: '; read TEST; export TEST) | echo "done: ${TEST}"
Isso não mostra o prompt "dados de entrada" e não lê nada do stdin e, em vez disso, apenas exibe:
done:
Entre
foo | bar
foo
ebar
execute simultaneamente. Seu código é exibidodone:
porque o finalecho
não lê seu stdin e não espera por nada canalizado por meio de seu stdin. Ele faz seu trabalho imediatamente.Além disso ,
${TEST}
after|
não tem nada a ver com a variável que vocêread
define antes|
. Ao construir um pipeline, o Bash executa cada comando em um subshell separado (o último pode ou não ser executado no contexto do shell principal).Isto é o que eu acho que você quer:
(em Bash
read -p 'input data: ' TEST
também funcionará).Não há necessidade de canalizar nada para nada aqui.
Em geral, caso você precise interagir com o usuário de dentro de um pipe (quero dizer, de dentro de um pipe genuinamente necessário),
/dev/tty
pode ser útil. Exemplo artificial:Aqui
read
não se lê desde o primeiroecho
, lê-se formulário/dev/tty
. Nemread
o segundoecho
imprime paranl
:read -p
imprime seu prompt para stderr por padrão,echo
imprime para/dev/tty
porque redirecionamos. Com efeito, os dados (foo
+nova linha) vão deecho
paracat
paranl
como se nada mais estivesse lá.Pode parecer um truque, mas é um caso de uso legítimo. Por exemplo, veja Como/por que
ssh
a saída para tty quando stdout e stderr são redirecionados? e minha resposta lá .