현재 트랩 함수의 에코 문을 표준 출력으로 인쇄하는 데 문제가 있습니다. 내가 실행하는 명령의 모든 출력(오류 및 표준 출력)을 로그 파일로 리디렉션합니다. 그러나 오류가 발생하면 오류를 로그 파일 대신 stdout으로 다시 리디렉션하고 싶습니다.
나는 단지 trap 1> on_exit EXIT
. 하지만 나는 그것에 대해 전혀 모른다. 어떻게 해야 하나요?
편집하다:
설명하자면, 모든 출력(stderr 및 stdout)을 의도적으로 로그 파일로 리디렉션하고 있습니다. 어떤 지점에서든 오류가 발생하면 해당 명령의 오류 출력이 로그에 기록되고(내가 원하는 것) on_exit
로그 파일 대신 사용자 보기(stdout)에 함수가 출력되기를 원합니다. 내 스크립트에는 현재 로그 파일로 출력하는 트랩 기능이 있습니다. 난 그냥 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
원본 stderr에 메시지를 인쇄하고 오류 발생 시 종료되도록 수정된 OP 스크립트:
#!/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