閉じた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)が閉じます。