GNU/Linux >> Tutoriels Linux >  >> Linux

Comportement inattendu d'un script shell ?

Cette question a déjà une réponse ici :SSH provoque l'arrêt de la boucle while

(1 réponse)
Fermé il y a 4 ans.

J'ai deux scripts :

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

Et maintenant je les lance

$ ./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 sortie de bar.sh est surprenant pour moi. Je m'attendrais à ce que ce soit le même pour les deux scripts.

Pourquoi la sortie de foo.sh et bar.sh différer? Est-ce un bug ou une fonctionnalité ?

Remarque

Ce qui suit fonctionne comme je m'y attendais, c'est-à-dire que la sortie de ceci est la même que la sortie de foo.sh :

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

Pourquoi ?

Réponse acceptée :

Dans bar.sh , les two est consommé par ssh . Dans le dernier exemple, la sortie complète de echo est utilisé par for avant qu'il ne commence à boucler.

Pour éviter d'avoir ssh engloutissez vos données à partir de l'entrée standard, utilisez ssh -n . Cela connectera l'entrée standard de ssh avec /dev/null plutôt qu'avec l'entrée standard du while boucle.

Cela fera ce que vous attendez de lui :

#!/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 vous aviez écrit

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

puis le cat sur la machine distante aurait produit two puisque son entrée standard lui est transmise depuis ssh qui à son tour l'a obtenu de la boucle et echo . Il imprimera two plutôt que one puisque la première ligne d'entrée a déjà été consommée par read .


Linux
  1. Expiration du délai dans un script shell ?

  2. Script Shell avec fonction et paramètre comme variables ?

  3. Eof inattendu lors de la recherche d'un ```' correspondant - Script Bash ?

  4. Le script shell se bloque sur la commande de messagerie ?

  5. Comment insérer une nouvelle ligne dans le script shell Linux ?

Grep -v Comportement inattendu ?

Envoi de courrier HTML à l'aide d'un script shell

Vérifier la connectivité de la base de données à l'aide du script Shell

Envoi d'un mail à partir d'un script shell Linux

écrire un script shell en ssh sur une machine distante et exécuter des commandes

Bibliothèque de sortie de script shell coloré