bash 4.x에서 다음이 있는 경우:
err_handler() {
echo You received error $1|mail -s "script error" MAILTO
}
trap err_handler ERR
트랩을 호출할 때 실제 stderr 출력을 함수로 어떻게 보내나요? 나는 stderr를 리디렉션하기 위해 모든 줄에 논리를 넣는 것을 피하고 싶습니다. 이것이 함정의 요점이라고 생각합니다.
답변1
명령이 0이 아닌 종료 상태로 반환될 때 출력이 이미 완료되었으므로 오류 출력을 소급하여 캡처할 수 없습니다. 그러나 다음 명령을 실행하면 스크립트의 모든 stderr 출력을 처음부터 파일로 리디렉션할 수 있습니다.
exec 2>/some/file
스크립트 시작 부분에. 이 명령 없는 형식은 exec
현재 쉘 프로세스에 리디렉션을 적용합니다. 그런 다음 오류가 발생하면 파일을 보낼 수 있습니다.
이 방법의 또 다른 장점은 어떤 이유로든 메일 전송이 실패하더라도 로컬에서 파일을 계속 볼 수 있다는 것입니다(물론 원인이 디스크 장애인 경우는 제외).