Voir "Pipe cassée" dans cette situation est rare, mais normal.
Lorsque vous exécutez type rvm | head -1
, bash s'exécute type rvm
dans un processus, head -1
dans un autre. 1 La sortie standard de type
est connectée à l'extrémité "écriture" d'un tuyau , la sortie standard head
à l'extrémité "lecture". Les deux processus s'exécutent en même temps.
Le head -1
processus lit les données de stdin (généralement par blocs de 8 Ko), imprime une seule ligne (selon l' -1
option) et se ferme, provoquant la fermeture de l'extrémité "lecture" du tuyau. Étant donné que la rvm
fonction est assez longue (environ 11 kB après avoir été analysée et reconstruite par bash), cela signifie que la head
sortie type
a encore quelques kB de données à écrire.
À ce stade, puisque type
tente d'écrire sur un tuyau dont l'autre extrémité a été fermée - un tuyau cassé - la fonction write () qu'elle a appelée renverra une erreur EPIPE, traduite par "tuyau cassé". En plus de cette erreur, le noyau envoie également le signal SIGPIPE à type
, qui par défaut tue immédiatement le processus.
(Le signal est très utile dans les shells interactifs, car la plupart des utilisateurs ne veulent pas que le premier processus continue de fonctionner et essaie d'écrire nulle part. Pendant ce temps, les services non interactifs ignorent SIGPIPE - il ne serait pas bon pour un démon de longue durée de mourir sur une erreur aussi simple - ils trouvent donc le code d'erreur très utile.)
Cependant, la livraison du signal n'est pas 100% immédiate, et il peut y avoir des cas où write () renvoie EPIPE et le processus continue de s'exécuter pendant un court moment avant de recevoir le signal. Dans ce cas, type
obtient suffisamment de temps pour remarquer l'échec de l'écriture, traduire le code d'erreur et même imprimer un message d'erreur à stderr avant d'être tué par SIGPIPE. (Le message d'erreur indique "-bash: type:" car il type
s'agit d'une commande intégrée de bash lui-même.)
Cela semble être plus courant sur les systèmes multi-CPU, car le type
processus et le code de livraison du signal du noyau peuvent s'exécuter sur différents cœurs, littéralement en même temps.
Il serait possible de supprimer ce message en type
corrigeant le code intégré (dans le code source de bash) pour qu'il se ferme immédiatement lorsqu'il reçoit un EPIPE de la fonction write ().
Cependant, il n'y a rien à craindre et ce n'est en aucun cas lié à votre rvm
installation.