Das liegt daran, dass grep -q
wird sofort mit einem Nullstatus beendet, sobald eine Übereinstimmung gefunden wird. Die zfs
Der Befehl schreibt immer noch in die Pipe, aber es gibt keinen Reader (weil grep
ist beendet), also wird ein SIGPIPE
gesendet Signal vom Kernel und beendet sich mit dem Status 141
.
Ein weiterer häufiger Ort, an dem Sie dieses Verhalten sehen, ist bei head
. zB
$ seq 1 10000 | head -1
1
$ echo ${PIPESTATUS[@]}
141 0
In diesem Fall head
las die erste Zeile und beendete das, was einen SIGPIPE
erzeugte Signal und seq
mit 141
beendet .
Siehe "Das berüchtigte SIGPIPE-Signal" aus dem Linux Programmer's Guide.
Eine andere Möglichkeit wäre, keine Pipe zu verwenden, sondern eine Prozessersetzung:
grep -q tank <(zfs list)
Update:Ich denke, es ist dasselbe, da der Prozess, der in Klammern ausgeführt wird, auch sigpipe empfängt.
Ich bin mit zfs list
nicht vertraut , aber ich denke, es beschwert sich darüber, dass seine Standardausgabe geschlossen ist - grep -q
wird im Gegensatz zu grep
sofort beendet, wenn eine Übereinstimmung gefunden wird .