오류 스트림에 자신의 정보를 추가하세요.

오류 스트림에 자신의 정보를 추가하세요.

우리 모두 알고 있듯이 다음 명령을 사용하여 오류를 특정 파일로 리디렉션할 수 있습니다.

./some_script 2>error_log

여러 스크립트를 실행 중인데 해당 스크립트의 오류를 오류 파일에 넣기를 원합니다.

각 오류 인스턴스 앞에 스크립트 이름과 같은 정보를 추가할 수 있는 방법이 있습니까? 이렇게 하면 오류 로그에 오류를 게시한 스크립트 이름 등을 기록할 수 있습니다.

답변1

스크립트에 대한 오류 로깅 기능을 만듭니다. 그것은 다음과 같습니다:

logerr () {
    printf '%s - %s - %s\n' \
    "$(date '+%F:%T')" \
    "$(basename "$0")" \
    "$*" >&2
}

그런 다음 스크립트에서 이를 호출할 수 있습니다. 예를 들면 다음과 같습니다.

if false; then
    : something for pass
else
    logerr failed to be false
fi

그리고 2>error_log사용할 때마다 보장됩니다. 추가를 error_log사용해야 합니다 2>>error_log.


다른 명령에서 오류를 잡아서 기록하려면 다음과 같은 코드를 조합하면 됩니다.

#!/bin/bash

logerr () {
    local message=$*
    if [[ ! -t 0 ]]; then
        message=$(</dev/stdin)
    fi
    if [[ -n "$message" ]]; then
        printf '%s - %s - %s\n' \
        "$(date '+%F:%T')" \
        "$(basename "$0")" \
        "$*" >&2
    fi
}

ls -lts /fake/path 2>&1 >/dev/tty | logerr

표준 출력을 필요한 해당 위치로 리디렉션하십시오.

이렇게 하면 logerr스크립트가 표준 입력(열려 있는 경우)에서 읽을 수 있습니다(프로그램을 logerr로 파이프할 수 있음). 문제는 프로그램이 stderr에 오류 메시지를 보내고 stdin과 별도로 유지되기를 원한다는 것입니다.

답변2

./thescript.sh 2>&1 1>/dev/null | sed '1 s/^/error_message_starts:\n/' >> error_log;

여기의 토론과 다음 내용을 바탕으로:
https://stackoverflow.com/questions/2342826/how-to-pipe-stderr-and-not-stdout

우리가 원하는 것을 추가합니다. 오류 스트림(fd2)을 파이프할 수 있어야 합니다. 파이프로 연결할 수 있는 유일한 출력은 fd1입니다. 따라서 fd2는 fd1로 리디렉션되어야 합니다. 또한 방해가 되지 않도록 fd1을 제거해야 합니다.

  • ./script.sh
  • 2>&1 오류 스트림(fd2), fd1이 가는 곳으로 이동합니다.
  • 1>/dev/null. Fd1이 방금 절벽에서 떨어졌습니다. 이제 오류 로그(fd2)만 파이프됩니다.
  • | sed.. sed에서 파이프 작업을 수행하려면 이 내용을 앞에 추가하세요.
  • >> error_log는 스트림을 오류 로그에 추가합니다.

관련 정보