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
.