如何真正隐藏我启动的进程中的所有控制台输出?

如何真正隐藏我启动的进程中的所有控制台输出?

我从 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当前正在输入此问题的会话的终端窗口仍在生成它们。

所以问题是:

为什么上面的重定向不起作用?

我如何正确地重定向它们?

答案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

相关内容