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