Il est rare, mais normal, de voir "Broken pipe" (tuyau cassé) dans cette situation.
Lorsque vous exécutez type rvm | head -1
bash exécute type rvm
en un seul processus, head -1
dans un autre. 1 La sortie stdout de type
est connecté à l'extrémité "écriture" d'un tuyau , le stdin de head
à l'extrémité "lecture". Les deux processus se déroulent en même temps.
En head -1
lit des données à partir de stdin (généralement par morceaux de 8 kB), imprime une seule ligne (en fonction de l'attribut -1
), et sort, provoquant la fermeture de l'extrémité "lecture" du tuyau. Puisque l'option rvm
est assez longue (environ 11 kB après avoir été analysée et reconstruite par bash), ce qui signifie que la fonction head
sort pendant que type
a encore quelques Ko de données à écrire.
À ce stade, étant donné que type
essaie d'écrire dans un tuyau dont l'autre extrémité a été fermée - une cassé pipe - la fonction write() qu'elle appelle renverra une erreur EPIPE, traduite par "Broken pipe". En plus de cette erreur, le noyau envoie également le signal SIGPIPE à la fonction type
qui, par défaut, tue le processus immédiatement.
(Ce signal est très utile dans les shells interactifs, car la plupart des utilisateurs ne souhaitent pas que le premier processus continue à s'exécuter et à essayer d'écrire nulle part. Par ailleurs, les services non interactifs ignorent SIGPIPE - il ne serait pas bon qu'un démon fonctionnant depuis longtemps meure sur une erreur aussi simple - et trouvent donc le code d'erreur très utile).
Cependant, la délivrance du signal n'est pas immédiate à 100 %, et il peut arriver que write() renvoie EPIPE et que le processus continue à fonctionner pendant un court moment avant de recevoir le signal. Dans ce cas, type
a suffisamment de temps pour remarquer l'échec de l'écriture, traduire le code d'erreur et même imprimer un message d'erreur sur stderr avant d'être tué par SIGPIPE. (Le message d'erreur indique "-bash : type :" puisque type
est une commande intégrée à bash).
Cette situation semble plus fréquente sur les systèmes multi-CPU, étant donné que le nombre d'unités de traitement de l'information est inférieur à celui des unités de traitement de l'information. type
et le code de distribution des signaux 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 Parcheandola type
(dans le code source de bash) pour sortir immédiatement lorsqu'il reçoit un EPIPE de la fonction write().
Toutefois, il n'y a pas lieu de s'inquiéter et cela n'a rien à voir avec votre rvm
l'installation de quelque manière que ce soit.