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.