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

おすすめ記事