BASH 4: 티를 로그 파일로, /dev/null로 장애 조치

BASH 4: 티를 로그 파일로, /dev/null로 장애 조치

해당 작업을 기록하려고 시도하는 스크립트가 있습니다. 이 모든 것을 할 수 있는 티셔츠가 있습니다. 현재는 $LOG_FILE에 쓸 수 없으면 스크립트가 종료됩니다. 대신 로그 파일에 쓰지 않기를 원합니다.

스크립트에서 기록된 부분은 다음과 같습니다.

for foo in "${array_of_foos[@]"; do
  {get bar from foo} | sort -u
done | xargs -n 100 -P 20 bar_processor.sh |& tee "$LOG_FILE"

사용자가 로그 파일에 쓰기를 원하지 않을 때 설정할 수 있는 것이 있습니까? LOG_FILE=/dev/null아니면 이를 처리하는 더 좋은 방법이 있습니까? 이 스크립트는 루트로 실행되지 않으며 절대로 실행되지 않습니다.

답변1

쓰기 가능한 로그 파일이나 아직 존재하지 않지만 쓰기 가능한 디렉터리에 있는 로그 파일을 처리하려면 다음을 시도하는 것이 가장 신뢰할 수 있는 방법입니다.

LOG_FILE=loggit.log
( printf "" >>"$LOG_FILE" ) 2>/dev/null || LOG_FILE=/dev/null

# ...
echo "Stuff to be logged" >>"$LOG_FILE"
some | pipeline >>"$LOG_FILE"

특정 경우에는 출력을 복사하고 싶습니다.표준 출력로그 파일에 저장하면 이제 다음을 수행할 수 있습니다.

some | pipeline | tee -a "$LOG_FILE"

의미 있는 로그 파일이 있는지 여부에 따라 다른 작업을 수행하려는 경우 더 복잡한 시나리오를 사용하여 이를 처리할 수 있습니다. LOG_FILE=위의 코드 조각에서 설정(즉, 아무것도 설정하지 않음)한 다음 테스트 뒤에 있는 코드에서 다음을 수행할 수 있습니다.

[[ -n "$LOG_FILE" ]] && echo "Stuff to be logged" >>"$LOG_FILE"

그리고 가능하다면 다음과 같은 구문을 사용하여 로깅하는 동안 무조건 코드를 실행할 수 있습니다.

some | pipeline >>"${LOG_FILE:-/dev/null}"
some | pipeline | tee -a "${LOG_FILE:-/dev/null}"

다른 질문에 대한 내 답변도 참조하세요.파일에 텍스트를 추가하는 방법"${LOG_FILE:-/dev/null}"매번 반복을 피하는 방법.

관련 정보