TipsShell: Ajouter conflit stdin
This commit is contained in:
parent
6bc29c7df6
commit
1e366dbd4c
40
TipsShell.md
40
TipsShell.md
|
@ -583,6 +583,46 @@ Détecter les tabulations
|
||||||
$ grep -P '\t'
|
$ grep -P '\t'
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
|
## Conflit sur `stdin`
|
||||||
|
|
||||||
|
Rediriger `stdin` peut être nécéssaire, par exemple, lorsqu’on combine une boucle `while read`, un _here-document_ et des commandes interactives.
|
||||||
|
|
||||||
|
Dans la boucle suivante, lorsqu’on rentre dans la boucle, la variable `hostname` contient bien « server1 ».
|
||||||
|
|
||||||
|
~~~ { .bash }
|
||||||
|
while read hostname
|
||||||
|
do
|
||||||
|
ssh "${hostname}"
|
||||||
|
done << eof
|
||||||
|
server1
|
||||||
|
server2
|
||||||
|
eof
|
||||||
|
~~~
|
||||||
|
|
||||||
|
On peut s’attendre à ce qu’au prochain tour de boucle, `hostname` contienne « server2 », mais lorsque la commande `ssh` sera exécutée durant le premier passage de la boucle, c’est bien `ssh` qui va consommer la ligne « server2 » ! Pour empêcher ça, on peut faire lire un autre descripteur de fichier, comme `3`, à `read` et envoyer le _here-document_ dessus :
|
||||||
|
|
||||||
|
~~~ { .bash }
|
||||||
|
while read hostname 0<&3
|
||||||
|
do
|
||||||
|
ssh "${hostname}"
|
||||||
|
done 3<< eof
|
||||||
|
server1
|
||||||
|
server2
|
||||||
|
eof
|
||||||
|
~~~
|
||||||
|
|
||||||
|
On peut aussi faire lire au autre descripteur de fichier à `ssh` à la place :
|
||||||
|
|
||||||
|
~~~ { .bash }
|
||||||
|
while read hostname
|
||||||
|
do
|
||||||
|
ssh "${hostname}" 0<&3
|
||||||
|
done 3<&0 << eof
|
||||||
|
server1
|
||||||
|
server2
|
||||||
|
eof
|
||||||
|
~~~
|
||||||
|
|
||||||
# Serveur mail
|
# Serveur mail
|
||||||
|
|
||||||
## Avoir vision des différentes erreurs mailq (MAILER-DAEMON)
|
## Avoir vision des différentes erreurs mailq (MAILER-DAEMON)
|
||||||
|
|
Loading…
Reference in a new issue