exec와 tee를 로그 파일에 추가 : bash 명령 설명 이것을 보았습니다. export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log exec > >(tee $LOGFILE) exec 2>&1 무엇을합니까?

내 bash 스크립트 파일 맨 위에서 이것을 보았습니다.

export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1

무엇을합니까? 여기서 두 개의 exec 프로세스는 무엇입니까? 이렇게 유지하면 스크립트 실행의 모든 ​​결과가 파이프로 전달 $LOGFILE되지만 exec문장 의 관점에서 이해하고 싶었습니다 .



답변

exec에서는 1) 파일 열기 및 리디렉션 2) 실제 작업 exec(현재 프로세스 이미지를 다른 프로세스 이미지로 대체)을 수행합니다.

이러한 exec것들은 방향 전환입니다.

먼저 첫 번째 인수가 있는 동시 실행 프로세스에 연결된 프로세스 대체 생성 파이프로 디스크립터 (1)를 경로 재 지정 ( exec 1> >(tee $LOGFILE)) 한 다음 디스크립터 (2)를 디스크립터 (2)가 현재 위치 (티) 와 동일한 위치로 재 지정합니다. 파이프).stdouttee$LOGFILEstderr1

파일 디스크립터가 상속 받았다는 것을 명심하면, 모든 미래 stdoutstderr출력이 tee프로세스 로 이동하여 파일 $LOGFILE디스크립터 1이 원래 (어쩌면 터미널)를 가리키는 모든 위치로 작성됩니다 .


참고 : 간단한 명령 확장프로세스 대체에 대한 bash (1)
에서 / searching에서 알 수 있듯이 프로세스 확장 ( )이 다른 확장과 함께 발생 하기 때문에 티 프로세스는 원래 stdout (= 원래 파일 설명자 1)로 출력됩니다. 리디렉션이 실행됩니다. 이는 리디렉션 이 시작된 발생 하며 상위 셸에서 상속 된 것과 동일한 파일 설명자 1을 남겨둔다는 것을 의미합니다 . (그렇지 않으면 자체 입력에 쓰면 IO 패턴에 따라 교착 상태가 될 수 있습니다).>() <()exec 1> >(tee "$LOGFILE") teeteetee


답변