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 .