73

我想google-chrome在后台运行一个程序 ( ),但阻止它向终端输出任何消息。

我试过这样做:

google-chrome 2>&1 1>/dev/null &

但是,终端仍然没有消息,例如:

[5746:5746:0802/100534:ERROR:object_proxy.cc(532)] 调用方法失败:org.chromium.Mtpd.EnumerateStorag...

我究竟做错了什么?如何将所有输出重定向到/dev/null

4

3 回答 3

81

重定向运算符从左到右进行评估。你错误地把它放在了2>&1前面,它指向2同一个地方,就像1当前指向的是本地终端屏幕一样,因为你还没有重定向1。您需要执行以下任一操作:

2>/dev/null 1>/dev/null google-chrome &

或者

2>/dev/null 1>&2 google-chrome &

重定向操作符相对于命令的位置无关紧要。您可以将它们放在命令之前或之后。

于 2013-08-02T19:38:25.437 回答
46

Redirection部分,Bash 的参考手册说:

运算符[n]>&word用于 [...] 复制输出文件描述符

要将标准错误和标准输出重定向到file您应该使用表单

&>file

关于您的情况,这意味着替代

2>&1 1>/dev/null

&>/dev/null
于 2013-08-02T09:19:01.263 回答
3

似乎语法不同:

./a.out 1>/dev/null 2>&1 &

请参阅 FD = 2 的设备在./a.out 1>/dev/null 2>&1./a.out 2>&1 1>/dev/null &

1) FD=2 指向 /dev/null

>./a.out 1>/dev/null 2>&1 &
[1] 21181
>lsof -p `pidof a.out`
COMMAND   PID            USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
a.out   21181 xxxxxxxxxxxxxxx    0u   CHR 136,43      0t0        46 /dev/pts/43
a.out   21181 xxxxxxxxxxxxxxx    1w   CHR    1,3      0t0      3685 /dev/null
a.out   21181 xxxxxxxxxxxxxxx    2w   CHR    1,3      0t0      3685 /dev/null

2) FD=2 指向 /dev/pts/43

>./a.out 2>&1 1>/dev/null &
[1] 25955
>lsof -p `pidof a.out`
COMMAND   PID            USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
a.out   25955 xxxxxxxxxxxxxxx    0u   CHR 136,43      0t0        46 /dev/pts/43
a.out   25955 xxxxxxxxxxxxxxx    1w   CHR    1,3      0t0      3685 /dev/null
a.out   25955 xxxxxxxxxxxxxxx    2u   CHR 136,43      0t0        46 /dev/pts/43
于 2013-08-02T09:19:08.557 回答