이는 스크립트 출력을 파일로 리디렉션하는 일반적인 시나리오입니다. 권한 문제 또는 어떤 이유로든 출력 파일을 생성할 수 없습니다. (일반적으로 제품의 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