起動プロセスですべてのコンソール出力を実際に非表示にするにはどうすればよいですか? [コピー]

起動プロセスですべてのコンソール出力を実際に非表示にするにはどうすればよいですか? [コピー]

Firefoxから興味のないすべてのメッセージを受け取りました。

Gtk-Message: Failed to load module "pk-gtk-module"
Gtk-Message: Failed to load module "canberra-gtk-module"

だから、firefox次のように終了して再起動します。

$ firefox 2>&1 > /dev/null &

「リダイレクトstderrしてstdout両方null」にパイプします。

残念ながら、その不快なメッセージは消えませんでした。実際、firefox現在この質問を入力しているセッションを開始した端末ウィンドウは依然として質問を生成しています。

質問は次のとおりです。

上記のリダイレクトが機能しないのはなぜですか?

どうやって正しくリダイレ​​クトしますか?

答え1

これは逆の順序で行う必要があります。まず、stdoutをリダイレクトしてから、stderrをstdoutにリダイレクトします。

firefox >/dev/null 2>&1 &

編集:ここに説明があります。2>&1ファイル記述子のコピー操作(bashのマニュアルページと検索を参照Duplicating File Descriptors):「ファイル記述子1と同じ操作を実行するためにファイル記述子2をコピーします」を意味します。その後、fd 2に記録されたすべての内容は、fd 1がその内容を送信した場所に送信されます。したがって、stderr(2)とstdout(1)は同じ場所に書き込まれます。ただし、これらは独立しているため、後でfd 1を変更すると(stdoutをリダイレクトするなど)、fd 2は変更されていません。 fd 1が書き込んでいる位置に記録され続けます。今後最後のリダイレクトです。

最初にstdoutをリダイレクトしてからコピーすると、fd 1とfd 2は両方ともfd 1がリダイレクトされるのと同じ場所に書き込まれます。

デフォルトでは、シェルは左から右にリダイレクト/リピートを実行するため、順序が正しいことを確認する必要があります。

ちなみに、特別なケースでは、bashはstdoutとstderrを同じ場所にリダイレクトするショートカットを提供します。

 cmd &> /dev/null

等しい

  cmd > /dev/null 2>&1

関連情報