4

Why are the redirection operations in this command line apparently ignored by bash? I aim to redirect standard error to standard out, and then feed the whole lot into the void.

( cd ../src/ && python -m SimpleHTTPServer 8000 2>&1 > /dev/null ) &

I'm running a SimpleHTTPServer on some static web content, so that wget can check it for dead links. However, I don't want to see the errors from the server (requests for failed pages), as the wget log file provides all the information I need.

Nevertheless, when I run this...

( cd ../log/ && wget --quiet --spider --recursive -o spider.log http://localhost:8000/ 2>&1 > /dev/null )

...the original SimpleHTTPServer command running in the background carries on spewing out Standard Error reports about failed resource requests, like...

127.0.0.1 - - [28/May/2013 17:22:31] "GET /technology/actuator.html HTTP/1.1" 200 -
127.0.0.1 - - [28/May/2013 17:22:31] code 404, message File not found
cefn
  • 2,895
  • 19
  • 28

2 Answers2

7

First both stdout(1) and stderr(2) point to your terminal.

You then redirect stderr to whatever your stdout points to. (Which is the terminal.)

Afterwards you redirect stdout to /dev/null. But stderr still points to the terminal.

You can do it the other way around >/dev/null 2>&1: This way you first redirect stdout to /dev/null and then stderr to the same.

Bash provides the shorthand &>/dev/null for this.

michas
  • 25,361
  • 15
  • 76
  • 121
  • 1
    Maybe an example how to apply it to any command would be nice for people who do not want to read the full question and/or answer and does not know the full context. – matousc Sep 18 '18 at 08:40
2

Use &>/dev/null to suppress everything.

jaypal singh
  • 74,723
  • 23
  • 102
  • 147