Linux
我如何真正從我啟動的程序中隱藏所有控制台輸出?
我從 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
會話的終端視窗仍然在生成它們。所以問題是:
為什麼上述重定向不起作用?
如何正確重定向它們?
您必須以相反的順序執行此操作:首先重定向標準輸出,然後將標準錯誤重定向到標準輸出:
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