如何将所有输出重定向到/dev/null?

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

我试过这么做:

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

然而,终端仍然填满了没有消息,如:

[5746:5746:0802/100534: ERROR: object _ xy. cc (532)]未能调用方法: org.chromium. Mtpd. EnumerateStorag..。

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

73252 次浏览

In the section Redirection, Bash's reference manual says:

The operator [n]>&word is used [...] to duplicate output file descriptors

To redirect both standard error and standard output to file you should use the form

&>file

With regard to your case, that means substitute

2>&1 1>/dev/null

with

&>/dev/null

It seems that syntax is different:

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

See the devices for FD = 2 are different when ./a.out 1>/dev/null 2>&1 and ./a.out 2>&1 1>/dev/null &

1) FD=2 points to /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 points to /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

Redirection operators are evaluated left-to-right. You wrongly put 2>&1 first, which points 2 to the same place, as 1 currently is pointed to which is the local terminal screen, because you have not redirected 1 yet. You need to do either of the following:

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

Or

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

The placement of the redirect operators in relation to the command does not matter. You can put them before or after the command.