How can I pipe stderr, and not stdout?
bash, grep, pipe, stderr, stdout
Solution
First redirect stderr to stdout — the pipe; then redirect stdout to `/dev/null` (without changing where stderr is going):
command 2>&1 >/dev/null | grep 'something'
For the details of I/O redirection in all its variety, see the chapter on Redirections in the Bash reference manual.
Note that the sequence of I/O redirections is interpreted left-to-right, but pipes are set up before the I/O redirections are interpreted. File descriptors such as 1 and 2 are references to open file descriptions. The operation `2>&1` makes file descriptor 2 aka stderr refer to the same open file description as file descriptor 1 aka stdout is currently referring to (see `dup2()` and `open()`). The operation `>/dev/null` then changes file descriptor 1 so that it refers to an open file description for `/dev/null`, but that doesn't change the fact that file descriptor 2 refers to the open file description which file descriptor 1 was originally pointing to — namely, the pipe.
Problem
I have a program that writes information to `stdout` and `stderr`, and I need to process the `stderr` with `grep`, leaving `stdout` aside. Using a temporary file, one could do it in two steps: ``` command > /dev/null 2> temp.file grep 'something' temp.file ``` But how can this be achieved without temp files, using one command and pipes?