Bash自体の出力はどこに行きますか?

Bash自体の出力はどこに行きますか?

sleep 100&スクリプトの場合は、コマンドの後にシェルに表示される「[1] 00000」メッセージをリダイレクトしたいと思います。もう必要ありませんが、この問題を解決している間、Bash自体の出力はどこに行くのか考え始めました。なぜbash > testbash &> testそれともbash | [some program]機能しませんか?ファイル記述子1と2は、単に端末に書き込まれるファイル記述子ですか?それでは、bashや他のプログラムがユーザーに印刷したい場合、どのように標準出力をバイパスしますか?

答え1

メッセージはstderrに送信されましたが、バッシュコマンドのstderrではなくstderrなので、コマンドの出力とエラーをリダイレクトしても影響はありません。

これを説明するために、コマンドグループのstderrをリダイレクトしてメッセージをリダイレクトできます。

$ { sleep 100& } 2>test
$ more test
[1] 94358
$ 
$ 
$ # Then, 100 seconds later:
[1]+  Done                    sleep 100
$ 

「完了」などのステータスメッセージが望ましくない場合(そしてそのメッセージが一般的に表示される状況にある場合)、disownバックグラウンドタスクを実行できます。

$ { sleep 10& disown $!; } 2>test
$ more test
[1] 94400
$ 
$ # After 10 seconds:
$ 

答え2

対話する機能をジョブ制御と呼びます。 POSIX 標準化された API 関数に基づいています。

ジョブ制御は、端末セッションを中心に構成されます。ジョブ制御シェル(この場合はBash)はセッションの「交通警察」です。ジョブ制御の前景にあるプロセスグループとバックグラウンドにあるプロセスグループを制御します。同じシェルは>、などの構文を使用するときにすべての間接参照もソートします。シェルが端末に何かを出力したいときは、ボスなので簡単にできます。<|

特定のコマンドが前景で実行されると、シェルは背景に配置されます。その瞬間にはすべてが静かになる。シェルは、フォアグラウンドにあるときに情報メッセージを配置します。たとえば、現在のフォアグラウンドにあるプログラムで - を実行すると、Ctrl次のメッセージが表示されます。Z

[1]+  Stopped                 vi

メッセージを印刷する前に、Bashは最初にプログラムを背景に置き、自分自身を前景に置きます。その後、「TTYスティックを保持」します。端末から入力を受け取り、端末に書き込むことができます。このとき、ジョブ制御に関する情報メッセージを印刷します。

リダイレクトは、シェル自体からこれらのメッセージをキャプチャしません。タスク1がバックグラウンドで実行されていてpidがあることを示すメッセージを入力した場合、そのメッセージcommand > file &は入力されません。これは言葉ではありません。シェルはそれに対するリダイレクトのみをソートします。シェル自体は端末のファイル記述子を保存し、メッセージを送信します。[1] nnnnnnnnnnfile> filecommand[1] ...

関連情報