[英]Bash: Trap ERR does not work when pipe operator is used
我試圖將stdout和stderr發出的所有內容記錄到日志文件中並仍然保留控制台。 為此,我只是附加: |& tee -a log_file.log
到每個命令。
但是,如果腳本期間發生任何錯誤,我還想運行自定義命令。 為此,我在腳本的開頭添加了以下內容: trap "echo Non-zero exit code detected" ERR
。
問題是使用管道操作符,陷阱中的回顯不再執行。
腳本1,沒有管道:
$cat test.sh
#!/bin/bash
trap "echo Non-zero exit code detected!" ERR
function fail_please()
{
echo "Returning non-zero exit code!"
return 1
}
fail_please
輸出1:
$ ./test.sh
Returning non-zero exit code!
Non-zero exit code detected!
腳本2,帶管道:
$ cat test.sh
#!/bin/bash
trap "echo Non-zero exit code detected!" ERR
function fail_please()
{
echo "Returning non-zero exit code!"
return 1
}
fail_please |& tee log_file.log
輸出2:
$ ./test.sh
Returning non-zero exit code!
$ cat log_file.log
Returning non-zero exit code!
在輸出2中,消息“檢測到非零退出代碼!” 不見了。 知道為什么嗎? 謝謝!
ERR
陷阱觸發“簡單命令”管道不是一個簡單的命令。
它可能會觸發整個管道的結果(我不確定),你可以通過設置pipefail
來獲得更接近你想要的pipefail
。
(注意:這是人們經常不建議使用set -e
的原因之一,因為它有這樣令人驚訝的細節。)
pipefail
工作的原因是通常管道的返回狀態是最后一個命令的返回,但是如果pipefail
上有pipefail
,則變為最后一個失敗命令的返回狀態。
除非啟用了pipefail選項,否則管道的返回狀態是最后一個命令的退出狀態。 如果啟用了pipefail,則管道的返回狀態是以非零狀態退出的最后(最右邊)命令的值,如果所有命令都成功退出,則返回零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.