I want to run a program (google-chrome) in the background, but prevent it from outputting any messages to the terminal.
I tried doing this:
google-chrome 2>&1 1>/dev/null &
However, the terminal still fills up without messages like:
[5746:5746:0802/100534:ERROR:object_proxy.cc(532)] Failed to call method: org.chromium.Mtpd.EnumerateStorag...
What am I doing wrong? How do I redirect all the output to /dev/null
?
Redirection operators are evaluated left-to-right. what you did wrong was 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. What you need to do is 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.
In the section Redirection
bash's reference manual says:
The operator [n]>&word
is used [...] to duplicate output file descriptors
To redirect both stderr
and stdout
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