por que o bash se comporta de maneira diferente para o script do stdin?

4

Este é o meu script, test.sh

if ssh myhost true; then
  echo 1
fi
echo 2

p.s. Eu configurei a chave ssh para myhost, por isso não pedirá senha.

Se eu rodar via bash, ele irá gerar duas linhas

$ bash test.sh
1
2

No entanto, se eu redirecionar o script para o stdin do bash, ele só emitirá uma linha

$ bash < test.sh
1

Por que o bash se comporta de maneira diferente? Isso é um bug do bash ou de um recurso mágico?

Eu tentei o bash 4.3 e 4.4.

p.s. Se eu substituir ssh myhost true por true , o script sempre exibirá duas linhas.

    
por kcwu 31.03.2017 / 19:04

1 resposta

3

Resposta curta: há uma diferença importante entre ter comandos de leitura bash de um arquivo e fazer com que o bash tome uma entrada all de um arquivo.

ssh tende a ler toda a entrada disponível da entrada padrão e a envia pela conexão ao computador remoto. Quando você executa bash test.sh , o shell lê os comandos do test.sh, mas a entrada padrão ainda é o seu terminal; O ssh enviará qualquer coisa que você tenha digitado antes para o comando true (que irá ignorá-lo). Quando você executa bash < test.sh , a entrada padrão é configurada para o script, então tanto o bash quanto os comandos que ele executa são lidos a partir dele. o bash lê o bloco if e executa-o; ssh lê o restante do script (o comando echo 2 ) e o envia ao controle remoto true , que o ignora. O bash descobre que está no final de sua entrada, então sai.

    
por 01.04.2017 / 08:30

Tags