SIGPIPE
SIGPIPE : signal que le noyau envoie à un processus qui écrit dans un tube dont l'extrémité de lecture est fermée. Son action par défaut est de terminer le processus, ce qui est voulu : dans grep motif gros.log | head -n 1, grep s'arrête dès que head a lu sa ligne et s'est terminé, au lieu de parcourir le reste du fichier pour rien.
Le shell rapporte un processus tué par un signal avec le code 128 + numéro du signal, soit 141 pour SIGPIPE (signal 13). Sous set -o pipefail, ce code devient celui du tube entier, et un script en set -euo pipefail s'arrête sans message sur un tube qui a parfaitement fonctionné, et seulement certaines fois, selon que l'écrivain a fini avant ou après la fermeture. On l'évite en ne fermant pas le tube trop tôt (grep -m 1 plutôt que | head -n 1), ou en traitant explicitement le code 141 dans PIPESTATUS.
Dans les cours
- Traiter du texte : grep, sed, awk, jq, leçon 1 : Penser en flux : lignes, champs et petits outils
- Traiter du texte : grep, sed, awk, jq, leçon 3 : sed : le cycle et la substitution