私が知っている限り、/usr/bin/modulecmd
次の例のように、このコマンドで生成されたいくつかの出力はstdoutまたはstderrに送信されません。
% /usr/bin/modulecmd bash help null >/dev/null 2>&1
This module does absolutely nothing.
It's meant simply as a place holder in your
dot file initialization.
Version 3.2.9
すべての出力がstdoutまたはstderrに移動するようにコマンド(/usr/bin/modulecmdなど)を呼び出す方法はありますか?またはコードから/usr/bin/modulecmd
キャプチャを呼び出す方法はありますか?みんな通常、端末に送信される出力は何ですか?
答え1
プログラムが実行する操作によって異なります。標準出力(fd 1)およびエラー(fd 2)に加えて、標準出力(fd 1)入力するリダイレクトせずにターミナルでプログラムを起動すると(fd 0)、通常は読み書き用に開き、出力を書き込むために使用できます。別のオプションは、/dev/tty
プロセスの制御端末に接続された新しいfdを提供する明示的にopenです。
modulecmd
何らかの理由で標準入力を使用します。これを実行すると、strace
ヘッダー行を元のfd 2に書き込んでから(fd 0に関連付けられていないいくつかの関連しないfdジャグリングの後)、fd 0(stdin)をfd 2にコピーしてそこに説明を印刷することがわかります。
... write(2, "\n--------- モジュール別 Hel"..., 70) = 70 ... 【他のfdの無関係シャッフル】 ... 繰り返し(0) = 2 write(2, "\t このモジュールは決して"..., 37) = 37 write(2, "\r\n", 2) = 2 write(2, "\tちょうど場所という意味です"..., 44) = 44 ...
したがって、stdoutとstderrのリダイレクトに加えて、stdin(fd 0)をいくつかのファイルにリダイレクト0>somefile
(または抑制)してメッセージの対応する部分をリダイレクトできます。/dev/null
同様のリダイレクト< /dev/tty
によって、プロセスに明示的な読み取り専用 fd を提供することで出力をブロックすることもできます。 (ただし、プログラムでは呼び出しエラーが発生します。) Linuxでは、生のwrite()
標準入力が端末に接続されていても同じ結果が得られます。< /dev/stdin
一部のプログラムを使用している場合は、/dev/tty
出力をキャプチャするのが難しい場合があります。もし何かsetsid
制御端末なしでプログラムを起動するために使用できます。これはオープンが/dev/tty
失敗することを意味します。 (まあ、Linuxではそうなります。)
答え2
私の考えでは、この質問に対する答えは」いいえ「理由は次のとおりです。コマンドが開始される前に存在していた出力のみをリダイレクトできます。つまり、コマンドが新しい出力を開くと、リダイレクトを介してこれを防ぐことはできません。