Il motivo è perché la pipe è chiusa da grep
quando ha ancora dei dati da leggere da cat
. Il segnale SIGPIPE
viene catturato dal gatto ed esce.
Ciò che di solito accade in una pipeline è che la shell esegue cat
in un processo e grep
in un altro. Lo stdout di cat
è connesso all'estremità di scrittura della pipe e allo stdin di grep
alla fine della lettura. Quello che è successo è stato grep
ha colpito una ricerca di pattern che non esisteva ed è uscito immediatamente causando la chiusura dell'estremità di lettura del pipe, che cat
non gli piace poiché ha alcuni dati in più da scrivere nella pipe. Poiché le azioni di scrittura si verificano su un altro che è stato chiuso dall'altra parte, SIGPIPE
viene catturato dal cat
su cui esce immediatamente.
Per un caso così banale, potresti rimuovere del tutto l'utilizzo della pipeline ed eseguirlo come grep "pattern" file.txt
quando i contenuti del file sono resi disponibili sullo stdin di grep
da cui potrebbe leggere.