얼마 전에 스크립트를 만들고 그 주위에 로깅을 추가했지만 로깅 리디렉션이 어떻게 작동하는지 잊어버렸습니다. :-(
주요 사항은 다음과 같습니다.
#!/bin/bash
LOGFILE=/some/path/mylogfile
(
# here go my commands which produce some stdout
# and, if something goes wrong, also some stderr
) 1>>${LOGFILE} 2> >( tee -a ${LOGFILE} >&2 )
스크립트를 실행하면 에 아무것도 인쇄되지 않고 stdout
의 내용만 인쇄됩니다 stderr
. 로그 파일은 ${LOGFILE}
표준 출력과 표준 오류를 캡처합니다.
스크립트를 실행할 때 모든 것이 정상이고 터미널에 출력이 없다는 것을 알고 있습니다. 출력이 있는 경우 문제가 발생했다는 것을 알 수 있으며 로그 파일을 확인하여 문제가 무엇인지 확인할 수 있습니다.
이제 나를 혼란스럽게 하는 리디렉션 부분은 다음 구문입니다.2> >( some command )
거기에서 무슨 일이 일어나고 있는지 설명할 수 있는 사람이 있나요?
답변1
>(...)
~라고 불리는프로세스 교체. 이는 "외부" 프로그램이 마치 파일인 것처럼 "내부" 프로그램에 쓸 수 있게 해줍니다.
이 경우에는 추가할 내용을 작성한 stderr
다음 모든 내용을 다시 작성합니다.tee -a ${LOGFILE} >&2
LOGFILE
stderr
리디렉션 연산자는 어느 방향으로든 프로세스 대체를 수행할 수 있으므로 여기에 쓰거나(이 예에서와 같이) 읽을 수 있습니다. 이는 예를 들어 루프 자체를 실행하기 위해 실행하는 <(...)
데 편리한 방법입니다 .while