(1 respuesta)
Cerrado hace 4 años.
Tengo dos guiones:
foo.sh:
#!/bin/bash
echo -e "onentwo" |
while read line; do
cat not-existing
echo hello $line
done
bar.sh:
#!/bin/bash
echo -e "onentwo" |
while read line; do
ssh [email protected] 'cat not-existing' # Here is the only difference
echo hello $line
done
Y ahora los ejecuto
$ ./foo.sh
cat: not-existing: No such file or directory
hello one
cat: not-existing: No such file or directory
hello two
$ ./bar.sh
cat: not-existing: No such file or directory
hello one
La salida de bar.sh
me sorprende Espero que sea lo mismo para ambos scripts.
¿Por qué la salida de foo.sh
y bar.sh
¿diferir de? ¿Es un error o una característica?
Nota
Lo siguiente funciona como espero, es decir, la salida de esto es la misma que la salida de foo.sh
:
#!/bin/bash
for line in `echo -e "onentwo"`; do
ssh [email protected] 'cat not-existing'
echo hello $line
done
¿Por qué?
Respuesta aceptada:
En bar.sh
, los two
es consumido por ssh
. En el último ejemplo, la salida completa de echo
es usado por for
antes de que comience a repetirse.
Para evitar tener ssh
engulla sus datos desde la entrada estándar, use ssh -n
. Esto conectará la entrada estándar de ssh
con /dev/null
en lugar de con la entrada estándar de while
bucle.
Esto hará lo que esperas que haga:
#!/bin/bash
echo -e "onentwo" |
while read line; do
ssh -n [email protected] 'cat not-existing' # Here is the only difference
echo hello $line
done
Si hubieras escrito
#!/bin/bash
echo -e "onentwo" |
while read line; do
ssh [email protected] 'cat'
echo hello $line
done
luego el cat
en la máquina remota habría generado two
ya que su entrada estándar se transmite desde ssh
que a su vez lo obtuvo del bucle y echo
. Imprimirá two
en lugar de one
ya que la primera línea de entrada ya ha sido consumida por read
.