2015-10-09 67 views
4

在在Ubuntu 14.04 bash命令行:爲什麼在標準輸入中Gnu grep退出狀態始終爲0?

echo "z" | grep -e 'x' ; echo $PIPESTATUS 

始終顯示爲0,雖然,很明顯,有一個在 「Z」 無 「X」。但:

echo "z" > /tmp/z 
grep -e 'x' /tmp/z ; echo $PIPESTATUS 

作品如我期望,返回1,如果圖案是「X」(如圖所示),和0,如果圖案是「Z」。

爲什麼?

回答

6

PIPESTATUS實際上是一個BASH數組變量,它包含最近執行的前臺管道中的進程的退出狀態值列表。

要打印所有的退出狀態,你需要使用它:

echo "z" | grep -e 'x' ; echo ${PIPESTATUS[@]} 
0 1 

哪裏0是第一echo命令的退出狀態和1是grep命令的退出狀態。

當您使用echo $PIPESTATUS它只是打印第一個元素的數組。

要檢查grep命令狀態,您甚至不需要使用PIPESTATUS

你應該只使用$?

echo "z" | grep -q 'x' ; echo $? 
1 
+2

是。用bash數組,'$ ary'實際上是'$ {ary [0]}' –

+1

是的,這是一個很大的「啊哈!」爲了我。謝謝。 –

相關問題