GNU/Linux >> Linux Esercitazione >  >> Linux

Comportamento imprevisto di uno script di shell?

Questa domanda ha già una risposta qui :SSH provoca l'interruzione del ciclo while

(1 risposta)
Chiuso 4 anni fa.

Ho due script:

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

E ora li eseguo

$ ./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

L'output di bar.sh è sorprendente per me. Mi aspetto che sia lo stesso per entrambi gli script.

Perché l'output di foo.sh e bar.sh differire? È un bug o una funzionalità?

Nota

Quanto segue funziona come mi aspetto, ovvero l'output di questo è lo stesso dell'output di foo.sh :

#!/bin/bash
for line in `echo -e "onentwo"`; do
    ssh [email protected] 'cat not-existing'
    echo hello $line
done

Perché?

Risposta accettata:

In bar.sh , i two viene consumato da ssh . Nell'ultimo esempio, l'output completo da echo è usato da for prima che inizi il ciclo.

Per evitare di avere ssh divorare i dati dall'input standard, utilizzare ssh -n . Questo collegherà l'input standard di ssh con /dev/null piuttosto che con l'input standard del while ciclo.

Questo farà quello che ti aspetti che faccia:

#!/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

Se avessi scritto

#!/bin/bash
echo -e "onentwo" |
while read line; do
    ssh [email protected] 'cat'
    echo hello $line
done

poi il cat sulla macchina remota avrebbe prodotto two poiché il suo input standard gli viene trasmesso da ssh che a sua volta lo ha ottenuto dal loop e da echo . Stamperà two anziché one poiché la prima riga di input è già stata consumata da read .


Linux
  1. Ssh:script di shell per l'accesso a un server Ssh?

  2. Timeout in uno script di shell?

  3. Grep -v Comportamento imprevisto?

  4. Modifica lo script della shell mentre è in esecuzione

  5. Impedisce a ssh di suddividere i parametri dello script della shell

Invio di una mail da uno script della shell Linux

Aggiunta di utenti ai sudoer tramite script di shell

scrivi uno script di shell su ssh su una macchina remota ed esegui i comandi

Libreria di output di script di shell colorata

Come inserire una nuova riga nello script della shell di Linux?

Itera sulla variabile $ PATH usando lo script di shell