내 Bash 스크립트 파일 상단에 다음이 표시됩니다.
export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1
그것은 무엇을 합니까? 여기서 두 개의 exec 프로세스는 무엇을 하고 있나요? 이렇게 유지하면 스크립트 실행의 모든 출력이 파이프로 연결된다는 것을 알고 있지만 명령문 관점에서 이해하고 $LOGFILE
싶습니다 .exec
답변1
셸에서는 exec
1) 파일 열기 및 리디렉션 2) 실제 exec
작업(현재 프로세스 이미지를 다른 프로세스 이미지로 교체)을 수행합니다.
리디렉션 exec
입니다.
먼저, 설명자(1)를 exec 1> >(tee $LOGFILE)
동시에 실행 중인 프로세스(프로세스에 첫 번째 매개변수가 있음) stdout
에 연결된 프로세스 교체로 생성된 파이프로 리디렉션한 다음 설명자(2)를 설명자로 리디렉션하여 이제 동일한 위치 ( 티 파이프).tee
$LOGFILE
stderr
1
stdout
파일 설명자는 상속된다는 점을 기억하세요. 모든 future 와 stderr
출력을 process로 보냈고 프로세스는 파일 설명자 1이 원래 가리키는 곳(아마도 터미널) tee
에 이를 기록합니다 .$LOGFILE
노트:
/searching에서 알 수 있듯이 tee 프로세스는 원시 stdout(=raw 파일 설명자 1)으로 출력됩니다.큰 타격(1)~을 위한간단한 명령 확장그리고프로세스 교체>()
<()
, 리디렉션(및 기타 확장)이 수행되기 전에 프로세스 대체( )가 발생합니다. 이는 리디렉션이 exec 1> >(tee "$LOGFILE")
발생함 을 의미합니다.뒤쪽에 tee
tee
상위 셸에서 상속된 동일한 파일 설명자 1 로 시작되었습니다 . (반대의 경우 tee
자체 입력을 작성하므로 IO 모드에 따라 교착 상태가 발생할 수 있습니다.)