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
.