Linux

我如何真正從我啟動的程序中隱藏所有控制台輸出?

  • November 22, 2019

我從 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 &

如“重定向stderrstdout並將它們都輸出到null”中。

不幸的是,那些討厭的消息並沒有消失。事實上,我開始firefox會話的終端視窗仍然在生成它們。

所以問題是:

為什麼上​​述重定向不起作用?

如何正確重定向它們?

您必須以相反的順序執行此操作:首先重定向標準輸出,然後將標準錯誤重定向到標準輸出:

firefox >/dev/null 2>&1 &

編輯:這是一個解釋。2>&1是一個文件描述符複製操作(請參閱 bash 手冊頁並蒐索Duplicating File Descriptors):它說“複製文件描述符 2 以執行與文件描述符 1 相同的操作”。之後,寫入 fd 2 的任何內容都將發送到 fd 1 發送內容的任何地方。所以 stderr (2) 和 stdout (1) 將寫入同一個地方。但它們是獨立的,因此如果您之後更改 fd 1(例如,通過重定向標準輸出),fd 2 將保持不變:它仍將寫入 fd 1在上次重定向之前寫入的任何位置。

如果您先重定向 stdout 然後複製,則 fd 1 和 fd 2 都將寫入同一個地方:fd 1 被重定向到的地方。

基本上,shell 從左到右執行重定向/複製,因此您必須正確執行順序。

請注意,作為一種特殊情況,bash 提供了將 stdout 和 stderr 重定向到同一位置的快捷方式:

cmd &> /dev/null

相當於

 cmd > /dev/null 2>&1

引用自:https://unix.stackexchange.com/questions/553471