Vedere "tubo rotto" in questa situazione è raro, ma normale.
Quando esegui type rvm | head -1
, bash viene eseguito type rvm
in un processo, head -1
in un altro. 1 Lo stdout di type
è collegato all'estremità "write" di una pipe , lo stdin of head
all'estremità "read". Entrambi i processi vengono eseguiti contemporaneamente.
Il head -1
processo legge i dati dallo stdin (di solito in blocchi di 8 kB), stampa una singola riga (secondo l' -1
opzione) ed esce, causando la chiusura dell'estremità "read" del tubo. Poiché la rvm
funzione è piuttosto lunga (circa 11 kB dopo essere stata analizzata e ricostruita da bash), ciò significa che head
esce mentre type
ha ancora pochi kB di dati da scrivere.
A questo punto, poiché type
sta provando a scrivere su una pipe la cui altra estremità è stata chiusa - una pipe rotta - la funzione write () che ha richiamato restituirà un errore EPIPE, tradotto come "Broken pipe". Oltre a questo errore, il kernel invia anche il segnale SIGPIPE type
, che di default uccide immediatamente il processo.
(Il segnale è molto utile nelle shell interattive, dal momento che la maggior parte degli utenti non vuole che il primo processo continui a funzionare e che tenti di scrivere da nessuna parte. Nel frattempo, i servizi non interattivi ignorano SIGPIPE - non sarebbe utile per un demone di lunga durata muoiono per un errore così semplice - quindi trovano molto utile il codice di errore.)
Tuttavia, l'erogazione del segnale non è immediata al 100% e potrebbero verificarsi casi in cui write () restituisce EPIPE e il processo continua a essere eseguito per un breve periodo prima di ricevere il segnale. In questo caso, type
ottiene abbastanza tempo per notare la scrittura non riuscita, tradurre il codice di errore e persino stampare un messaggio di errore su stderr prima di essere ucciso da SIGPIPE. (Il messaggio di errore dice "-bash: type:" poiché type
è un comando incorporato di bash stesso.)
Questo sembra essere più comune sui sistemi multi-CPU, poiché il type
processo e il codice di consegna del segnale del kernel possono essere eseguiti su core diversi, letteralmente allo stesso tempo.
Sarebbe possibile rimuovere questo messaggio correggendo il type
builtin (nel codice sorgente di bash) per uscire immediatamente quando riceve un EPIPE dalla funzione write ().
Tuttavia, non è nulla di cui preoccuparsi e non è rvm
in alcun modo correlato alla propria installazione.