나는 그 사람을 읽었 exec
지만 여전히 내가 작업 중인 스크립트에서 다음 두 줄의 결과를 이해하지 못합니다.
exec >> >(tee -a $logfile)
exec 2>&1
나는 읽었다이 답변, 그러나 여전히 의심이 있습니다.
내가 이해한 바에 따르면 첫 번째 줄은 >>
스크립트 파일의 오른쪽에 있는 $logfile
모든 항목 에 출력(추가)을 발생시킵니다.>>
두 번째 줄은 스크립트의 2(stderr) 출력을 1(stdout)로 리디렉션합니다.
- 내 이해가 맞나요?
- 실행 취소 후의 동작이 이 두 줄을 실행하기 전과 동일하도록 위 명령을 실행 취소하려면 어떻게 해야 합니까?
- 스크립트에서 더 나아가서 백그라운드에서 일부 애플리케이션을 실행한다고 가정해 보겠습니다
someapp &
. 저는 이 명령을 스크립트와 별도로 터미널에서 실행하고 싶습니다. 그러면 스크립트에서 실행하는 것과 동일한 효과가 나타납니다.someapp &
위의 s를 사용하여 리디렉션을 설정하려면 어떻게 수정해야 합니까exec
?
답변1
exec >> >(tee -a $logfile)
부족:
exec 1>> >(tee -a $logfile)
다음과 동일:
exec 1>> /dev/fd/x
x
파이프의 쓰기 끝을 가리키는 파일 설명자는 어디에 있습니까?
이전에는 bash
파이프의 다른 쪽 끝에 연결된 fd 0(stdin)을 사용하여 하위 프로세스가 시작되었으며 동시에 실행 중입니다 tee
.
exec 1>> file
, O_TRUNC 없이 O_APPEND를 사용하여 파일을 열고 결과 fd를 1로 이동합니다.
/dev/fd/x
시스템에 따라 exec dup(x)
(대부분) 또는 fd x(Linux 및 cygwin에만 해당)에서 open과 동일한 파일을 엽니다 . 여기서는 fd할 때 차이 가 exec > >(...)
없습니다 .
이것은 약간 벗어난 주제이지만 tee -a $logfile
올바르지 않습니다. 경로가 O_APPEND에 저장된 파일을 tee -a -- "$logfile"
여는 것이 의도라면 $logfile
그렇게 되어야 합니다.
따라서 이 명령 후에 셸의 fd 1은 파이프를 가리킵니다. 파이프의 다른 쪽 끝에서 tee
오는 내용을 읽고 리디렉션 이전에 stdout이 가리키는 모든 항목(스크립트의 출력이 어떤 방식으로 리디렉션된 경우 터미널 장치 또는 기타 장치) tee
으로 전송됩니다 .$logfile
exec 2>&1
fd 2가 fd 1과 동일한 것을 가리키도록 하여 동일한 파이프를 만듭니다.
이렇게 하려면 저장해야 합니다.파일 설명 열기리디렉션 전에 fds 1과 2는 별도의 fds에서 열렸습니다.
exec 3>&1 4>&2 > >(tee -a -- "$logfile") 2>&1
3>&1
여기서 fd 3은 이제 dup2(1, 3)
fd 1과 동일한 열린 파일 설명을 가리킵니다.
실행 취소하고,
exec >&3 2>&4 3>&- 4>&-
someapp
또는 stdout 및 stderr을 원시 stdout 및 stderr로 실행합니다.
someapp >&3 2>&4 3>&- 4>&- &