Que*_*tin 4 shell bash io-redirection file-descriptors stderr
我想知道为什么当我们引用关闭的 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
Run Code Online (Sandbox Code Playgroud)
为什么外壳允许它?
运行时错误会发送到file_2哪里?
当您键入./file_2(使用所述文件可执行文件)时,系统实际运行/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)
Run Code Online (Sandbox Code Playgroud)
dup2由于 fd 2 关闭而失败,sh尝试在 stderr 上报告错误,但失败以及 stderr (fd 2) 已关闭。