シェルでプログラムの標準出力をオフにするには?

シェルでプログラムの標準出力をオフにするには?

私の言葉は、stdoutを/ dev / nullにリダイレクトせずにプログラムを開始する前にstdoutをブロックすることです。たとえば、write(1, "dd", 2);stdoutが私のデバイスに存在しないように、私が持っているすべてが-1を返します。

答え1

>&-9>&-stdoutやfd 9などのリダイレクトを使用してファイル記述子を閉じることができます。たとえば、

$ /bin/echo foo >&-
/bin/echo: write error: Bad file descriptor

ご注意ください、標準理論:

execファミリー関数の1つが正常に呼び出された後にファイル記述子0、1、または2が閉じられると、実装は新しいプロセスイメージでファイル記述子に指定されていないファイルを開くことができます。

したがって、すべてのシステムでオフになっているわけではありません。しかし、LinuxとMacでは誤ったfdエラーが発生します。

もちろん、多くのプログラムでは、fds 0、1、2が開かれたファイルを参照することを期待でき、そうでない場合は誤って動作する可能性があります。通常、新しく開かれたファイルがそれらのうちの1つに置かれ(システムコールが最も低い使用可能なfdを使用するため)、誤って無関係なファイルに使用されたときに発生します。

関連情報