場景:
在bash執行管道連接的命令,需要獲取到各個命令的返回值用於判斷
在腳本中我們可能需要將執行結果打印到屏幕,同時保存在文件中供后面分析用,寫出如下的命令
1 command 2》&1 | tee out.txt 2 ST=$?
發現不管command是否執行成功,ST的值都是0,如何解決這個問題呢
解決方式:
1,set -o pipefail
設置pipefail選項,這樣在執行管道連接的命令時,只要管道連接的命令中任何一個返回值不為0,則整個表達式返回值不為0
1 (base) $ ls /root 2> /dev/null | ls /home/ &>/dev/null 2 (base) $ echo $? 3 0 4 (base) $ set -o pipefail 5 (base) $ ls /root 2> /dev/null | ls /home/ &>/dev/null 6 (base) $ echo $? 7 2
這種方式在shells都可使用
2,$PIPESTATUS
shell的內部變量,$PIPESTATUS是一個數組,管道連接了多少個命令,$PIPESTATUS就包含有多少個值
1 (base) $ ls /root 2> /dev/null | ls /home/ &>/dev/null 2 (base) $ echo ${PIPESTATUS[@]} 3 2 0
根據需要獲取的命令返回值所在位置即可拿到相應的返回值
這種方式只在bash中生效,zsh或者其他shell可能不同