From 1e366dbd4c28716bdccbe9cc0720382b82862263 Mon Sep 17 00:00:00 2001 From: Alexis Ben Miloud--Josselin Date: Wed, 7 Sep 2022 15:31:46 +0200 Subject: [PATCH] TipsShell: Ajouter conflit stdin --- TipsShell.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/TipsShell.md b/TipsShell.md index e3715a90..98e5b458 100644 --- a/TipsShell.md +++ b/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)