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'
|
||||
~~~
|
||||
|
||||
## 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
|
||||
|
||||
## Avoir vision des différentes erreurs mailq (MAILER-DAEMON)
|
||||
|
|
Loading…
Reference in New Issue