我从 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
):它表示“复制文件描述符 2 以执行与文件描述符 1 相同的操作”。之后,写入 fd 2 的任何内容都将被发送到 fd 1 发送内容的地方。因此 stderr (2) 和 stdout (1) 将写入同一位置。但它们是独立的,因此如果您之后更改 fd 1 (例如通过重定向 stdout),fd 2 将保持不变:它仍然会写入 fd 1 正在写入的位置前最后一个重定向。
如果您先重定向 stdout,然后复制,则 fd 1 和 fd 2 都会写入同一位置:fd 1 重定向到的任何位置。
基本上,shell 从左到右执行重定向/重复,因此您必须确保顺序正确。
顺便注意,作为一种特殊情况,bash 提供了将 stdout 和 stderr 重定向到同一位置的快捷方式:
cmd &> /dev/null
相当于
cmd > /dev/null 2>&1