내 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)가 현재 위치 (티) 와 동일한 위치로 재 지정합니다. 파이프).stdout
tee
$LOGFILE
stderr
1
파일 디스크립터가 상속 받았다는 것을 명심하면, 모든 미래 stdout
와 stderr
출력이 tee
프로세스 로 이동하여 파일 $LOGFILE
디스크립터 1이 원래 (어쩌면 터미널)를 가리키는 모든 위치로 작성됩니다 .
참고 : 간단한 명령 확장 및 프로세스 대체에 대한 bash (1)
에서 / searching에서 알 수 있듯이 프로세스 확장 ( )이 다른 확장과 함께 발생 하기 때문에 티 프로세스는 원래 stdout (= 원래 파일 설명자 1)로 출력됩니다. 리디렉션이 실행됩니다. 이는 리디렉션 이 시작된 후 발생 하며 상위 셸에서 상속 된 것과 동일한 파일 설명자 1을 남겨둔다는 것을 의미합니다 . (그렇지 않으면 자체 입력에 쓰면 IO 패턴에 따라 교착 상태가 될 수 있습니다).>()
<()
exec 1> >(tee "$LOGFILE")
tee
tee
tee