트랩 기능의 에코를 다시 표준 출력으로 리디렉션

트랩 기능의 에코를 다시 표준 출력으로 리디렉션

현재 트랩 함수의 echo 문을 표준 출력으로 인쇄하는 데 문제가 있습니다. 실행한 명령의 모든 출력(오류 및 표준 출력)을 로그 파일로 리디렉션합니다. 그러나 오류가 발생하면 오류를 로그 파일 대신 stdout으로 다시 리디렉션하고 싶습니다.

비슷한 일을 하려고 생각 중이에요 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

관련 정보