なぜ2>&1(stderrをstdoutにリダイレクト)と<&->&-2>&-(stdin、stdout、stderrを閉じる)ですか?

なぜ2>&1(stderrをstdoutにリダイレクト)と<&->&-2>&-(stdin、stdout、stderrを閉じる)ですか?

誰かがなぜこのようなことをしますか?

(exec <&- >&- 2>&-; gzip somefile.txt) 2>&1 &

<&->&- 2>&- "...それぞれstdin、stdout、およびstderrを閉じることを意味します。"

ところで、「2>&1」が閉じているとしたら、なぜこれを行うのでしょうか。

答え1

標準ファイル記述子が開いている必要があるため、記載されているステートメントが正しくありません。

POSIX仕様:C.2.7リダイレクト

アプリケーションは、ファイル記述子が読み取り用に開かれていないか、ファイル記述子が書き込み用に開かれていないユーティリティーまたはアプリケーションを実行するために、または[n]<&-演算子を使用しないでください。これにより、実行されたプログラム(または組み込みシェル)の動作が不適切になる可能性があります。これらのファイル記述子を実行中のユーティリティまたはアプリケーションに渡さないようにするには、アプリケーションはそれを閉じるだけでなく、一部の実装でそれを行うことができますが、アプリケーションがそれに依存しない場合は自動的に再開する必要があります。[n]>&-012/dev/null

ディレクティブはむしろ

gzip somefile.txt >/dev/null 2>&1 &

答え2

彼らがしたことをする理由はありませんでした。2>&1この例では、実際には完全に冗長です。

関連情報