Questo perché grep -q
esce immediatamente con uno stato zero non appena viene trovata una corrispondenza. Il zfs
il comando sta ancora scrivendo sulla pipe, ma non c'è nessun lettore (perché grep
è uscito), quindi viene inviato un SIGPIPE
segnale dal kernel ed esce con uno stato di 141
.
Un altro luogo comune in cui vedi questo comportamento è con head
. ad esempio
$ seq 1 10000 | head -1
1
$ echo ${PIPESTATUS[@]}
141 0
In questo caso, head
leggi la prima riga e termina che ha generato un SIGPIPE
segnale e seq
terminato con 141
.
Vedi "Il famigerato segnale SIGPIPE" da The Linux Programmer's Guide.
Un'altra opzione sarebbe quella di non utilizzare una pipe, ma utilizzare una sostituzione di processo:
grep -q tank <(lista zfs)
Aggiornamento:immagino sia la stessa cosa, poiché anche il processo eseguito tra parentesi riceverà il sigpipe.
Non ho familiarità con zfs list
, ma immagino che si lamenti della chiusura del suo output standard - grep -q
esce immediatamente quando viene trovata una corrispondenza, a differenza di grep
.