Eu não estou procurando soluções alternativas ou soluções para o problema. Eu estou bem com isso não funcionar assim em bash
. Só não entendo porque não funciona.
Estou procurando uma resposta detalhada por que o script a seguir não funciona. Todos os resultados de pesquisa anteriores na Internet, incluindo postagens de unix.stackexchange.com, não conseguiram esclarecer isso completamente. Tem algo a ver com a read
leitura da stdin
qual não funciona porque stdin
já é "tirada" (?) pela cat
alimentação bash
pelo cano?
Exemplo de script bash test.sh
:
echo "Please say name:"
read NAME
echo "Hello $NAME"
Método 1 chamando o script com bash test.sh
:
$ bash test.sh
Please say name:
XYZ
Hello XYZ
$
Método 2 executando o script via tubulação para bash
:
$ cat test.sh | bash
Please say name:
$
Assim, o script retorna imediatamente ao prompt, sem esperar pela entrada ou mesmo imprimir a segunda linha.
Você leu de stdin com , mas o que
read
você leu foi a próxima linha de entrada padrão - ou sejaecho "Hello $NAME"
. Depois de ler essa linha, não havia mais entrada e, portanto, não havia mais comandos a serem executados, e o script acabou.Há apenas um fluxo de entrada padrão e você está tentando usá-lo para código e dados. Isso é o mesmo que uma
bash
sessão interativa lê comandos de sua digitação, bem comoread
respostas, bem como quaisquer outros comandos executados para os quais você deseja usar a entrada padrão.Você pode ver isso acontecendo se adicionarmos uma linha extra ao final do script:
Isso fornece um comando adicional para ver o script continuar a execução e nos mostra o que foi lido
NAME
:Você pode ver que a variável mantém literalmente o que foi escrito no arquivo de script - nenhuma interpolação, execução ou expansão de variável aconteceu.
Se você quiser
read
do terminal, é possível. A maneira mais simples que provavelmente funcionará é ler da saída padrão em vez da entrada padrão (!), que provavelmente está conectada ao TTY:Isso vai esperar que eu digite algo e, em seguida, passar para o resto do programa. Você também pode usar
/dev/tty
ou$(tty)
.