BASH SHELL中,通常使用 $? 來獲取上一條命令的返回碼,對於管道中的命令,使用$?只能獲取管道中最後一條命令的返回碼,例如: 下麵的例子 /djdjal/dajiojidksj.file是一個不存在的文件 cat /djdjal/dajiojidksj.file|cat 第一個cat失敗, ...
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[@]};