exec와 tee를 로그 파일에 추가 : bash 명령 설명


15

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

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

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


이것은 취소 할 수 있습니다 : linuxjournal.com/content/bash-redirections-using-exec
coffeMug

1
당신은 상단에 이것을보고 당신의 bash는 스크립트 파일? ;)
Sebb

1
exec줄은 완벽하게 하나 일 수 있습니다 ( exec > >(tee "$LOGFILE") 2>&1).
Jonathan Leffler

답변:


18

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.