Outros mencionaram que sua entrada padrão está sendo substituída por seu script transmitido. Este é um problema comum, mas é facilmente resolvido:
bash 3<&0 <<\SCRIPT #ref stdin in fd 3, replace stdin w/ SCRIPT
echo Doing some stuff... #do your stuff
printf "\r [ 3[0;33m?3[0m ] What is your name? "
read -e name <&3 #read from original stdin
echo "$name"
echo Done
SCRIPT
Na sequência acima eu uso um heredoc para substituir seu script canalizado. Porque um pipe ainda não substituiu o stdin de bash
com o que quer que fosse antes (geralmente um terminal) o acima é apenas um pouco menos complicado que o seu script precisará ser. Mas eu queria demonstrar como isso funcionaria, e essa é a maneira mais simples.
Quando bash
é invocado, todos os processos executados posteriormente herdarão todos os seus fds - a menos que você explicitamente >&-
os feche. Portanto, se você fizer apenas um redirecionamento simples no momento da chamada, esse redirecionamento ocorrerá em cascata para todos os filhos. Duping fd 0 a fd 3 acima torna possível mais tarde read <&3
dessa mesma fd sem ter que fazer nada que chateie como </dev/tty
- embora a última coisa possa ser uma boa ideia no caso de você ter uma boa razão para interaja com um usuário em um teclado, em oposição ao que esse usuário pode enviar para você.
De qualquer forma, o stdout ainda irá para o mesmo local - assim, todo o material echo/printf
será impresso em qualquer fluxo de saída, mas bash
receberá stdin
do script transmitido e quaisquer outras referências a ele precisarão ser explícitas.
Com o seu cachimbo, você precisará de mais uma camada:
{ wget ... | bash; } 3<&0
Isso funcionará da mesma maneira. Para fazer isso, você não precisa referenciar explicitamente o <&3
stream para o read
(ou qualquer outro comando) :
{ { echo "script$$(){"
wget ...
printf "\n} <&3; script$$\n"
} | bash
} 3<&0
Dessa forma, você realmente define uma função que contém todo o seu script canalizado e redireciona explicitamente o seu stdin salvo para o stdin da função uma vez que você tenha lido tudo, então você o chama. Assim, todos os comandos dentro tratam o <&3
como seu stdin e você não precisa alterar seu conteúdo de forma alguma para referenciá-lo, mas você ainda pode ler tudo em uma entrada padrão.