파일로의 리디렉션이 실패하더라도 스크립트는 계속 실행됩니다.

파일로의 리디렉션이 실패하더라도 스크립트는 계속 실행됩니다.

이는 스크립트 출력을 파일로 리디렉션하는 일반적인 시나리오입니다. 권한 문제 또는 어떤 이유로든 출력 파일을 생성할 수 없습니다. (일반적으로 제품의 NFR 요구 사항에 따라 구현된 로그 파일입니다.) 이제 스크립트 실행 자체가 차단됩니다. 출력 파일을 생성할 수 없는 경우에도 스크립트 실행이 계속되도록 이를 방지할 수 있는 방법이 있습니까?

답변1

내 제안은 이미 존재하는 로깅 하위 시스템( )을 사용하는 것입니다 syslog. 이에 액세스하는 명령줄 도구는 입니다 logger.

도구를 user적절한 출력 우선순위(오류, 경고, 정보, 디버그 등)로 설정하고 태그를 프로그램을 나타내는 레이블로 설정하면 작업이 완료됩니다.

your_program 2>&1 | logger -t your_program -p user.info

답변2

tee명령 출력을 직접 리디렉션하는 대신 중개자 역할을 할 수 있습니다 . 출력 파일을 열지 못했다고 해서 멈추지는 않습니다.

$ cat out.sh
#!/bin/bash
outfile=${1-/dev/null}
echo hello | tee "$outfile"
echo done.
$ touch unwritable; chmod a-w unwritable
$ bash out.sh unwritable 
tee: unwritable: Permission denied
hello
done.

파이프의 종료 상태는 마지막 명령의 종료 상태가 됩니다 tee. 파이프라인의 첫 번째 부분의 종료 상태가 필요한 경우 Bash 배열 등을 사용하여 PIPESTATUS얻을 수 있습니다.

출력 복사본을 스크립트의 표준 출력으로 리디렉션하지 않으려면 출력을 tee로 리디렉션하세요./dev/null

답변3

리디렉션은 관련 명령이 실행되기 전에 처리되므로 리디렉션이 실패하면 명령이 전혀 실행되지 않습니다.

그래서

./script.sh >"$output"

파일로의 리디렉션이 실패하는 경우 스크립트를 성공적으로 실행하려면 $output먼저 리디렉션을 수동으로 수행할 수 있는지 여부를 감지해야 합니다.

이는 예를 들어 출력을 리디렉션 echo하고 실패할 경우 캡처하여 테스트할 수 있습니다.

if ! echo >"$output" 2>/dev/null; then
    output=/dev/null
fi

./script.sh >"$output"

/dev/null여기서는 기본 출력 파일을 사용할 수 없는 경우 출력을 리디렉션합니다. 출력을 삭제하지 않고 표준 출력으로 이동하려면 예를 대신 사용할 수 있습니다 /dev/stdout./dev/null

관련 정보