닫힌 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)
dup2
fd 2가 닫혀서 실패하고 sh
stderr에 대한 오류 보고를 시도하지만 실패하고 stderr(fd 2)가 닫힙니다.