Vedere "tubo rotto" in questa situazione è raro, ma normale.
Quando esegui type rvm | head -1, bash viene eseguito type rvmin un processo, head -1in un altro. 1 Lo stdout di typeè collegato all'estremità "write" di una pipe , lo stdin of headall'estremità "read". Entrambi i processi vengono eseguiti contemporaneamente.
Il head -1processo legge i dati dallo stdin (di solito in blocchi di 8 kB), stampa una singola riga (secondo l' -1opzione) ed esce, causando la chiusura dell'estremità "read" del tubo. Poiché la rvmfunzione è piuttosto lunga (circa 11 kB dopo essere stata analizzata e ricostruita da bash), ciò significa che headesce mentre typeha ancora pochi kB di dati da scrivere.
A questo punto, poiché typesta 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, typeottiene 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 typeprocesso 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 typebuiltin (nel codice sorgente di bash) per uscire immediatamente quando riceve un EPIPE dalla funzione write ().
Tuttavia, non è nulla di cui preoccuparsi e non è rvmin alcun modo correlato alla propria installazione.