我从 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
会话的终端窗口仍然在生成它们。
所以问题是:
为什么上述重定向不起作用?
如何正确重定向它们?
您必须以相反的顺序执行此操作:首先重定向标准输出,然后将标准错误重定向到标准输出:
编辑:这是一个解释。
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 重定向到同一位置的快捷方式:
相当于