La raison est que le tuyau est fermé par grep
lorsqu'il a encore des données à lire à partir de cat
. Le signal SIGPIPE
est attrapé par le chat et il sort.
Ce qui se passe généralement dans un pipeline, c'est que le shell exécute cat
en un seul processus et grep
en autre. La sortie standard de cat
est connecté à la fin d'écriture du tube et du stdin de grep
jusqu'à la fin de la lecture. Ce qui s'est passé était grep
a frappé une recherche de modèle qui n'existait pas et a quitté immédiatement provoquant la fermeture de l'extrémité de lecture du tube, ce qui cat
n'aime pas car il a plus de données à écrire dans le tube. Étant donné que les actions d'écriture se produisent sur une autre extrémité qui a été fermée, SIGPIPE
est attrapé par le cat
sur lequel il sort immédiatement.
Pour un cas aussi trivial, vous pouvez supprimer complètement l'utilisation du pipeline et l'exécuter en tant que grep "pattern" file.txt
lorsque le contenu du fichier est rendu disponible sur le stdin de grep
sur lequel il pourrait lire.