將陷阱函數中的回顯重定向回標準輸出

將陷阱函數中的回顯重定向回標準輸出

我目前在將陷阱函數中的 echo 語句列印到標準輸出時遇到問題。我將所有輸出(錯誤和標準輸出)從我運行的命令重定向到日誌檔案。但如果遇到錯誤,我希望將錯誤重定向回標準輸出而不是日誌檔案。

我正在考慮做類似的事情trap 1> on_exit EXIT。但我對此一無所知。我該怎麼做?

編輯: 作為澄清,我故意將所有輸出(stderr 和 stdout)重定向到日誌檔案。如果在任何時候出現錯誤,該命令的錯誤輸出都會放入日誌中(這就是我想要的),並且我希望將函數on_exit輸出到使用者視圖(stdout)而不是日誌檔案。我的腳本目前具有將陷阱函數輸出到日誌檔案的功能。我只想將其發送到標準輸出。

#!/usr/bin/env bash
set -e

on_exit()
{
  echo "An error occurred"
}

function main()
{
  trap on_exit EXIT
  # for looping over set of commands
  $command &> "$LOGFILE"
}

main "$@"

答案1

[這更多的是評論而不是答案;不太清楚你想要實現什麼]

set -e將導致您的腳本因錯誤而退出,因此重定向任何內容都為時已晚。

也許你正在追求這樣的東西:

#! /bin/bash
set -o errtrace # let functions inherit the ERR trap
exec 3>&2       # save the original stderr into fd 3

on_error() {
        echo >&2 "An error occurred"    # still printed to the log the 1st time
        exec 2>&3       # switch back to the original stderr
        trap '' ERR     # disable ourselves
}
main() {
        trap on_error ERR
        no_such_command # this fail with an error
        no_such_command # again
        no_such_command # and again
}

main "$@" >/tmp/log 2>&1

運行時:

$ bash /tmp/err
/tmp/err: line 13: no_such_command: command not found
/tmp/err: line 14: no_such_command: command not found
$ cat /tmp/log
/tmp/err: line 12: no_such_command: command not found
An error occurred

OP 的腳本被修改為將訊息印到原始 stderr 並在出現錯誤時退出:

#!/usr/bin/env bash
set -o errtrace # let functions inherit the ERR trap
exec 3>&2       # save the original stderr

on_error()
{
  echo >&3 "An error occurred"
  exit 1
}

function main()
{
  trap on_error ERR
  # for looping over set of commands
  $command &> "$LOGFILE"
}

main "$@"

運行時:

$ command=no_such_command LOGFILE=/tmp/log bash /tmp/jeg
An error occurred
$ cat /tmp/log
/tmp/jeg: line 15: no_such_command: command not found

相關內容