stdoutまたはstderrに送信されていない出力をどのようにキャプチャしますか?

stdoutまたはstderrに送信されていない出力をどのようにキャプチャしますか?

私が知っている限り、/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ではそうなります。)

おすすめ記事