How redirect and append both stdout and stderr to a file with Bash


To redirect stdout to a truncated file in Bash:

cmd > file.txt

To redirect stdout in Bash, appending to a file:

cmd >> file.txt

To redirect both stdout and stderr to a truncated file:

cmd &> file.txt

There are two ways to stdout and stderr appending to a file, depending on your Bash version.

The classic and portable (Bash pre-4) way is:

cmd >> outfile 2>&1


cmd >> outfile 2>>log_error.out

A nonportable way, starting with Bash 4 is

cmd &>> outfile

(analog to &> outfile)

For good coding style, you should

  • decide if portability is a concern (then use classic way)
  • decide if portability even to Bash pre-4 is a concern (then use classic way)
  • no matter which syntax you use, not change it within the same script (confusion!)

If your script already starts with #!/bin/sh (no matter if intended or not), then the Bash 4 solution, and in general any Bash-specific code, is not the way to go.

Also remember that Bash 4 &>> is just shorter syntax — it does not introduce any new functionality or anything like that.

The syntax is (beside other redirection syntax) described here: