≡ Menu

Linux Redirect Error Output To File

I am a new Ubuntu Linux and bash shell user. I also know how to redirect output from display/screen to a file using the following syntax:

cmd > file
ls > file

However, some time errors are displayed on screen. How do I store and redirect output from the computer screen to a file on a Linux or Unix-like systems?

Bash / ksh and other modern shell on Linux has three file descriptors:

  1. stdin (0)
  2. stdout (1)
  3. stderr (2)

Syntax To redirect all output to file

The syntax is as follows to redirect output (stdout) as follows:

command-name >  output.txt
command-name >  stdout.txt

Syntax To redirect all error to file

The syntax is as follows to redirect errors (stderr) as follows:

command-name 2> errors.txt
command-name 2> stderr.txt

Syntax to redirect both output (stdout) and errors (stderr) to different files

The syntax:

command1 > out.txt 2> err.txt
command2 -f -z -y > out.txt 2> err.txt

Syntax to redirect both output (stdout) and errors (stderr) to same file

The syntax is:

command1 > everything.txt 2>&1
command1 -arg > everything.txt 2>&1

Syntax to redirect errors (stderr) to null or zero devices

Data written to a null or zero special file is discarded by your system. This is useful to silence out errors (also know as ‘error spam’):

command1 2> /dev/null
command1 2> /dev/zero
command2 -arg 2> /dev/null
command2 -arg 2> /dev/zero

Tip: Use tee command to redirect to both a file and the screen same time

The syntax is:

command1 |& tee log.txt
## or ##
command1 -arg |& tee log.txt
## or ##
command1 2>&1 | tee log.txt

Another usage:

#!/bin/bash
# My script to do blah ...
foo(){
 :
} 2>&1 | tee foo.log

OR

#!/bin/bash
# My script to do blah ...
{
   command1
   command2
} 2>&1 | tee script.log
Share this tutorial on:

Your support makes a big difference:
I have a small favor to ask. More people are reading the nixCraft. Many of you block advertising which is your right, and advertising revenues are not sufficient to cover my operating costs. So you can see why I need to ask for your help. The nixCraft, takes a lot of my time and hard work to produce. If you use nixCraft, who likes it, helps me with donations:
Become a Supporter →    Make a contribution via Paypal/Bitcoin →   

Don't Miss Any Linux and Unix Tips

Get nixCraft in your inbox. It's free:



{ 11 comments… add one }
  • Andrey Oliveira June 23, 2014, 12:15 pm

    In newer versions of bash and sh, for “Syntax to redirect both output (stdout) and errors (stderr) to same file” you can also use:

    command1 &> everything.txt

    • Dexter November 26, 2014, 5:20 am

      That good ways…

  • Philippe Petrinko June 24, 2014, 8:07 am

    Dear NixCraft (or Vivek?)

    You may consider to explain a bit more [tee] command.

    1) It can output to more than one file
    2) It can overwrite files, but also append to files
    3) It can even ignore interrupts.

    — Philippe

  • Jalal Hajigholamali June 24, 2014, 8:32 am

    Hi,

    Thanks a lot
    useful article…

  • Unni August 22, 2014, 1:27 pm

    is it possible to APPEND stdout and stderr to a file while printing to screen at the same time using TEE command.

  • xuhui November 24, 2014, 1:19 pm

    Useful for me!!!!

  • Gopal May 24, 2015, 2:10 am

    use tee -a to APPEND output using tee
    example : command | tee -a outfile.txt

  • Gopal May 24, 2015, 2:15 am

    Best way to achieve all echo outputs to both screen and file ( as suggested above )
    {
    …. your complete shell script with multiple echo statements
    } > 2>&1 | tee -a script.log

  • aref ghobadi August 15, 2015, 9:56 am

    Hi
    thanks a lot

  • karthikeyan December 6, 2015, 5:09 pm

    very useful. Thanks a lot.

  • rajesh November 27, 2016, 10:28 am

    Thanks very use full :)

Leave a Comment

You can use these HTML tags and attributes: <strong> <em> <pre> <code> <a href="" title="">


   Tagged with: