Il est beaucoup plus facile de visualiser les choses si vous pensez à ce qui se passe réellement avec les "redirections" et les "tuyaux". Les redirections et les canaux dans bash font une chose: modifier où les descripteurs de fichiers de processus 0, 1 et 2 pointent (voir / proc / [pid] / fd / *).
Quand une pipe ou "|" est présent sur la ligne de commande, la première chose à faire est que bash crée un fifo et pointe le FD 1 de la commande de gauche sur ce fifo, et pointe le FD 0 de la commande de droite sur le même fifo.
Ensuite, les opérateurs de redirection pour chaque côté sont évalués de gauche à droite et les paramètres actuels sont utilisés chaque fois que la duplication du descripteur se produit. Ceci est important car depuis que le tuyau a été installé en premier, le FD1 (côté gauche) et FD0 (côté droit) sont déjà modifiés par rapport à ce qu'ils auraient pu être normalement, et toute duplication de ceux-ci reflétera ce fait.
Par conséquent, lorsque vous tapez quelque chose comme ceci:
command 2>&1 >/dev/null | grep 'something'
Voici ce qui se passe, dans l'ordre:
- un tuyau (fifo) est créé. "commande FD1" pointe vers ce tuyau. "grep FD0" est également pointé vers ce tuyau
- "commande FD2" pointe vers l'endroit où "commande FD1" pointe actuellement (le tuyau)
- "commande FD1" pointe vers / dev / null
Ainsi, toutes les sorties que "command" écrit sur son FD 2 (stderr) se dirigent vers le tuyau et sont lues par "grep" de l'autre côté. Toutes les sorties que la "commande" écrit dans son FD 1 (stdout) se dirigent vers / dev / null.
Si à la place, vous exécutez ce qui suit:
command >/dev/null 2>&1 | grep 'something'
Voici ce qui se passe:
- un tuyau est créé et "commande FD 1" et "grep FD 0" sont pointés vers lui
- "commande FD 1" pointe vers / dev / null
- "commande FD 2" pointe vers où FD 1 pointe actuellement (/ dev / null)
Ainsi, tous les stdout et stderr de la "commande" vont dans / dev / null. Rien ne va dans le tuyau, et donc "grep" se fermera sans afficher quoi que ce soit à l'écran.
Notez également que les redirections (descripteurs de fichiers) peuvent être en lecture seule (<), en écriture seule (>) ou en lecture-écriture (<>).
Une note finale. Qu'un programme écrive quelque chose sur FD1 ou FD2, cela dépend entièrement du programmeur. Les bonnes pratiques de programmation dictent que les messages d'erreur doivent aller à FD 2 et la sortie normale à FD 1, mais vous trouverez souvent une programmation bâclée qui mélange les deux ou ignore la convention.