簡體   English   中英

Bash:使用管道運算符時,陷阱ERR不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM