How to redirect standard (stderr) error in bash

I am trying to redirect bash message into file named output.log. But, it is not getting redirected. How do I redirect both standard output and standard error in bash shell? In Linux, how do I redirect error messages?

Standard error (also known as stderr) is the default error output device. Use stderr to write all system error messages. The number (FD – File Descriptors) two (2) denotes the stderr. The default stderr is the screen or monitor. Standard output (also known as stdout) is used by a command to writes (display) its output. The default stdout is the screen. It is denoted by one number (1).

Tutorial details
Difficulty level Easy
Root privileges No
Requirements Linux, macOS or Unix-like OS with Bash
Est. reading time 3 minutes



2> is input redirection symbol and syntax is:

  1. To redirect stderr (standard error) to a file:
    command 2> errors.txt
  2. Let us redirect both stderr and stdout (standard output):
    command &> output.txt
  3. Finally, we can redirect stdout to a file named myoutput.txt, and then redirect stderr to stdout using 2>&1 (errors.txt):
    command > out 2>errors.txt

Make sure you use >> for appending data/log if the file already has data. For instance:

# overwrite existing file #
command1  &> output.txt
 
# append existing file #
command2  &>> output.txt
 
# append stdout and stderr to differnet files #
my_command 2>err.log 1>out.log

How to redirect standard error in bash
You must replace command with the command you want to run. Let us see some examples that explains redirection of standard error in bash.

How to redirect standard error in bash

Run find command and save all error messages to find.error.txt file:
find / -name "*.conf" 2> find.error.txt
You can view find.error.txt with the cat command:
cat find.error.txt
Sample outputs:

find: ‘/boot/grub2’: Permission denied
find: ‘/proc/tty/driver’: Permission denied
find: ‘/proc/1/task/1/fd’: Permission denied
find: ‘/proc/1/task/1/fdinfo’: Permission denied
...
..
find: ‘/proc/963/task/963/ns’: Permission denied
find: ‘/proc/963/task/1078/fd’: Permission denied
find: ‘/proc/963/task/1078/fdinfo’: Permission denied
....
..
find: ‘/var/spool/postfix/public’: Permission denied
find: ‘/var/spool/postfix/saved’: Permission denied
find: ‘/var/spool/postfix/trace’: Permission denied
find: ‘/usr/share/polkit-1/rules.d’: Permission denied
find: ‘/usr/libexec/initscripts/legacy-actions/auditd’: Permission denied

You need to use “2>” when you want to redirect stderr to a file. You can redirect stdout to file named results.txt and stderr to file named errors.txt:
find / -name "*.conf" >results.txt 2>error.txt
Verify results with the cat command:
cat results.txt
cat error.txt

This is useful in shell scripts or any other purpose.

How to redirect standard error and standard output in bash

You can send both stdout and stderr to a file named output.txt
command &>output.xt
find / -name "*.pl" &>filelist.txt

Please note that both errors and actual output of the find command stored into a file:
cat filelist.txt
Sample outputs:

/usr/bin/rsyslog-recover-qi.pl
/usr/lib/grub/i386-pc/gmodule.pl
/usr/lib/firmware/dsp56k/concat-bootstrap.pl
/usr/share/doc/GeoIP-1.5.0/fetch-geoipdata-city.pl
/usr/share/doc/GeoIP-1.5.0/fetch-geoipdata.pl
/usr/share/doc/postfix-2.10.1/examples/smtpd-policy/greylist.pl
find: ‘/usr/share/polkit-1/rules.d’: Permission denied
find: ‘/usr/libexec/initscripts/legacy-actions/auditd’: Permission denied

Summary

Command Description/Purpose
command 2>filename Redirect stderr to filename
command >output.txt 2>error.log
cat output.txt error.txt
Redirect stderr to file named error.log and stdout to file named output.txt
command &> filename Redirect stderr and stdout to filename
command 2>&- Just suppress error messages. No file created. No error message displayed on screen
command 1>&2
Sample code:

die(){
echo "$1" 1>&2
# add exit code 1 i.e. an unspecified error
exit 1
}
die "File not found"

Another example:

error_print() { local m=$1 local c=${2-1} echo >&2 -e "${m-}" exit "$code"
}
error_print "Failed to create directory" 2
[ ! -f "$CONFIG_FILE" ] && error_print "${CONFIG_FILE} not found."
Redirect error messages to standard output. Useful in shell script when you need to forcefully display error messages on screen

For more info see bash man page online or read it at the cli by using the man command:
man bash