21

According to "Linux: The Complete Reference 6th Edition" (pg. 44), you can pipe only STDERR using the |& redirection symbols.

I've written a pretty simple script to test this:

#!/bin/bash
echo "Normal Text."
echo "Error Text." >&2

I run this script like this:

./script.sh |& sed 's:^:\t:'

Presumably, only the lines printed to STDERR will be indented. However, it doesn't actually work like this, as I see:

    Normal Text.
    Error Text. 

What am I doing wrong here?

25

I don't know what text your book uses, but the bash manual is clear (if you're a little familiar with redirections already):

If |& is used, command1’s standard error, in addition to its standard output, is connected to command2’s standard input through the pipe; it is shorthand for 2>&1 |. This implicit redirection of the standard error to the standard output is performed after any redirections specified by the command.

So if you don't want to mix standard output and standard error, you'll have to redirect standard output somewhere else. See How to grep standard error stream (stderr)?

{ ./script.sh 2>&1 >&3 | sed 's:^:\t:'; } 3>&1

Both fd 1 and 3 of script.sh and sed will point to the original stdout destination however. If you want to be a good citizen, you can close those fd 3 which those commands don't need:

{ ./script.sh 2>&1 >&3 3>&- | sed 's:^:\t:' 3>&-; } 3>&1

bash and ksh93 can condense the >&3 3>&- to >&3- (fd move).

6

|& pipes stderr to stdin, like 2>&1 |, so the next program will get both on stdin.

$cat test.sh
#!/bin/bash
echo "Normal Text."
echo "Error Text." >&2
$./test.sh | sed 's:^:\t:'
Error Text.
        Normal Text.
$ ./test.sh |& sed 's:^:\t:'
        Normal Text.
        Error Text.
  • Oh, so it's basically equivalent to the longer expression runcommand 2>&1 | tee? ie runcommand |& tee? – Naftuli Kay Nov 10 '11 at 23:52
  • yes, they're the same. – Kevin Nov 11 '11 at 3:36
1

|& in bash is just a (not terribly portable) shortcut for 2>&1 |, so you should see every line indented.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.