"exec" 및 실행 취소와 동일

"exec" 및 실행 취소와 동일

나는 그 사람을 읽었 exec지만 여전히 내가 작업 중인 스크립트에서 다음 두 줄의 결과를 이해하지 못합니다.

exec >> >(tee -a $logfile)
exec 2>&1

나는 읽었다이 답변, 그러나 여전히 의심이 있습니다.

내가 이해한 바에 따르면 첫 번째 줄은 >>스크립트 파일의 오른쪽에 있는 $logfile모든 항목 에 출력(추가)을 발생시킵니다.>>

두 번째 줄은 스크립트의 2(stderr) 출력을 1(stdout)로 리디렉션합니다.

  1. 내 이해가 맞나요?
  2. 실행 취소 후의 동작이 이 두 줄을 실행하기 전과 동일하도록 위 명령을 실행 취소하려면 어떻게 해야 합니까?
  3. 스크립트에서 더 나아가서 백그라운드에서 일부 애플리케이션을 실행한다고 가정해 보겠습니다 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>&- &

관련 정보