GNU/Linux >> Tutoriales Linux >  >> Linux

¿Comportamiento inesperado de un script de Shell?

Esta pregunta ya tiene respuesta aquí :SSH hace que el ciclo while se detenga

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


Linux
  1. ¿Tiempo de espera agotado en un script de Shell?

  2. Grep -v ¿Comportamiento inesperado?

  3. ¿Script de shell con función y parámetro como variables?

  4. Eof inesperado al buscar coincidencias `”‘ – ¿Script Bash?

  5. Envío de correo HTML usando un script de shell

Agregar usuarios a sudoers a través de un script de shell

Shell script directorio actual?

Biblioteca de salida de scripts de shell de colores

Agregue una línea al archivo /etc/hosts con script de shell

La mejor manera de escribir comandos SSH remotos en Batch (Windows)

Iterar sobre la variable $ PATH usando el script de shell