BASH SHELL中,通常使用 $? 來獲取上一條命令的返回碼,對於管道中的命令,使用$?只能獲取管道中最后一條命令的返回碼,例如:
下面的例子 /djdjal/dajiojidksj.file是一個不存在的文件
cat /djdjal/dajiojidksj.file|cat

第一個cat失敗,第二個cat成功,所以$?的值為0
這種情況下,可以使用 $PIPESTATUS來獲取管道中每個命令的返回碼。
注意:
1、PIPESTATUS 是一個數組,第一條命令的返回碼存儲在${PIPESTATUS[0]},以此類推,上例中執行完管道中所有的命令后,PIPESTATUS數組第一個元素值為1,第二個元素值為0
2、如果前一條命令不是一個管道,而是一個單獨的命令,命令的返回碼存儲為${PIPESTATUS[0]},此時${PIPESTATUS[0]}同$?值相同(事實上,PIPESTATUS最后一個元素的值總是與$?的值相同)
3、每執行一條命令,切記PIPESTATUS都會更新其值為上一條命令的返回碼,
cat /djdjal/dajiojidksj.file|cat
if [ ${PIPESTATUS[0]} -ne 0 ]; then echo ${PIPESTATUS[@]}; fi
上例中執行完管道后,${PIPESTATUS[0]}值為1,${PIPESTATUS[1]}值為0
但是上面的腳本執行完成后,輸出為0,這是因為if 分支的測試命令值為真,然后 PIPESTATUS[0]的值此時被置為0。應當在命令執行完成后立即在同一個測試命令中對所有值進行測試,例如
if [ ${PIPESTATUS[0]} -eq 1 -a ${PIPESTATUS[1]} -eq 0 ] ; then echo something; fi
或者先將$PIPESTATUS數組保存下來,以后再處理,例如 tem=${PIPESTATUS[@]};
如果不清楚數組可以查看:Linux 中數組的使用