Em bar.sh , o two é consumido por ssh . No último exemplo, a saída completa de echo é usada por for antes de iniciar o loop.
Para evitar que ssh devore seus dados da entrada padrão, use ssh -n . Isso conectará a entrada padrão de ssh com /dev/null em vez da entrada padrão do loop while .
Isso fará o que você espera:
#!/bin/bash
echo -e "one\ntwo" |
while read line; do
ssh -n user@machine 'cat not-existing' # Here is the only difference
echo hello $line
done
Se você tivesse escrito
#!/bin/bash
echo -e "one\ntwo" |
while read line; do
ssh user@machine 'cat'
echo hello $line
done
então o cat na máquina remota teria gerado two desde que sua entrada padrão tenha sido transferida para ele de ssh , que por sua vez obteve o loop e echo . Ele imprimirá two em vez de one , pois a primeira linha de entrada já foi consumida por read .