닫힌 stderr을 bash에서 참조할 수 있는 이유는 무엇입니까?

닫힌 stderr을 bash에서 참조할 수 있는 이유는 무엇입니까?

닫힌 stderr을 참조할 때 bash가 오류 메시지를 표시하지 않는 이유가 궁금합니다. 다른 파일 설명자의 경우 복사하려면 열어야 합니다. 이 경우 Stderr는 약간 특별한 것 같습니다.

$ cat file_1
echo Test1 1>&5
$ cat file_2
echo Test2 1>&2

$ ./file_1 5>&-
./file_1: line 1: 5: Bad file descriptor
$ ./file_1 5>&1
Test1
$ ./file_2 2>&-
$ #NO ERROR and no output!
$ ./file_2
Test2

쉘이 왜 그것을 허용합니까?

답변1

런타임 오류는 어디로 전송되나요 file_2?

(해당 실행 파일을 사용하여) 입력하면 ./file_2시스템이 실제로 실행됩니다 . 즉 , 명령을 실행 하고 거기에서 발견된 오류를 보고하여 stderr로 출력하는 /bin/sh ./file_2새로운 복사본이 실행 중입니다 ./bin/sh./file2

/bin/sh하지만 방금 stderr을 끈 상태에서 실행했습니다. 그래서~ 고 싶어요오류가 발생하지만 아무데도 도달하지 않습니다.

다음을 통해 이를 확인할 수 있습니다.

$ strace -e write,dup2 -fo /dev/stdout sh -c 'echo foo >&2' 2>&-
8785  dup2(2, 1)                        = -1 EBADF (Bad file descriptor)
8785  write(2, "sh: 1: ", 7)            = -1 EBADF (Bad file descriptor)
8785  write(2, "2: Bad file descriptor", 22) = -1 EBADF (Bad file descriptor)

dup2fd 2가 닫혀서 실패하고 shstderr에 대한 오류 보고를 시도하지만 실패하고 stderr(fd 2)가 닫힙니다.

관련 정보