C'est parce que grep -q sort immédiatement avec un statut zéro dès qu'une correspondance est trouvée. Le zfs la commande écrit toujours dans le tube, mais il n'y a pas de lecteur (car grep est sorti), il reçoit donc un SIGPIPE signal du noyau et il se termine avec un statut de 141 .
Un autre endroit commun où vous voyez ce comportement est avec head . ex.
$ seq 1 10000 | head -1
1
$ echo ${PIPESTATUS[@]}
141 0
Dans ce cas, head lu la première ligne et terminé ce qui a généré un SIGPIPE signal et seq sorti avec 141 .
Voir "The Infamous SIGPIPE Signal" du Guide du programmeur Linux.
Une autre option serait de ne pas utiliser de tube, mais d'utiliser une substitution de processus :
grep -q tank <(liste zfs)
Mise à jour :je suppose que c'est la même chose, car le processus exécuté entre parenthèses recevra également sigpipe.
Je ne connais pas zfs list , mais je suppose qu'il se plaint de la fermeture de sa sortie standard - grep -q se ferme immédiatement lorsqu'une correspondance est trouvée, contrairement à grep .