(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 .