Hone

Lessons · Terminal · errors do not go down the pipe

Errors do not go down the pipe

A plain | carries standard OUTPUT. Errors travel on a second stream and go straight to your screen, past every stage.

Hone is a place to practise programming. This is one of its lessons, written out in full and free to read without an account.

What it is for

It is why a noisy command can still be the front of a pipeline, and why grepping for an error message finds nothing.

How to think about it

2>&1 before the pipe sends errors into the same stream. After the pipe it is too late and redirects the wrong thing.

Worked example

sh -c 'echo fine; echo broken 1>&2' > out.txt
Only 'fine' went into the file. 'broken' went to the screen.
cat out.txt
One line. The error was never in the stream.
sh -c 'echo fine; echo broken 1>&2' 2>&1 | grep broken
With 2>&1 the error joins the stream and grep can see it.

Your turn

Send errors into the pipe as well as normal output.

ls missing.txt  | grep missing

The trap

2>&1 has to come BEFORE the pipe. Written after it, it points stream 2 at wherever stream 1 goes in the NEXT command, which is not what you meant.

Next in Terminal

Every Terminal lesson on one page

Practise errors do not go down the pipe on HoneA question on it now, a coding challenge where there is one, and it is remembered for review. Free, no email needed.