Linux Shell 返回值之 PIPESTATUS


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 中數組的使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM