How to Redirect Stdout and Stderr to File in Bash [5 Cases]

While working with Bash scripts, sometimes it’s crucial to manage both the standard output (stdout) and standard error (stderr) effectively. By default, stdout displays the regular output of a command, while stderr displays error messages. In this writing, I will discuss how you can redirect stdout and stderr to file using the Bash redirection process with some practical Bash script examples.

Importance of Redirecting Stdout and Stderr in Bash

In Linux, every process has two default output streams, stdout (represented by file descriptor 1) & standard error or stderr (represented by file descriptor 2). You can redirect both of them using the symbol &> or >& or 2>&1. Now redirecting stdout & stderr in Bash is essential for several reasons:

  • Separating Normal Output from Errors: By redirecting stdout and stderr to different files or locations one can clearly distinguish between them.
  • Preventing Unwanted Output: Sometimes, programs generate debug messages on stderr that you don’t want to display which can be discarded by sending them to the null device.
  • Pipeline Management: When you use pipes (|) to pass the output of one command as input to another, it’s important to ensure that only intended data is being transferred, which can be done by redirecting Stderr.
  • Error Handling: Redirecting stderr to a file allows you to check for errors and take appropriate actions based on the error messages received.
  • Automation: In automated processes, scripts often run without user interaction. Redirecting stdout and stderr to files ensures that all relevant information is captured for reviewing later.

5 Practical Cases of Bash Redirect Stdout and Stderr to File

In the following article, I will show how you can redirect both command output & error messages in different practical scenarios while generating Bash scripts.

1. Redirect Both Stdout and Stderr to the Same File in Bash

In Bash, you can redirect both stdout & stderr to the same file using the &> redirection operator. Now, to redirect both stdout and stderr to the same file, write this script:

#! /bin/bash

cd /nonexistent_directory &> log.txt
cat log.txt

EXPLANATION
Here, the output & error messages of the cd command are redirected to a file named log.txt using the > operator. If log.txt already exists, it will be overwritten with the new output. Otherwise, a new fill will be created. Later, the contents of that file will be displayed using the cat command.

Redirect stdout and stderr to the same file in bashThe output & output error messages both are redirected to the log.txt file and I viewed the contents of the log.txt file using the cat command in the script.

2. Redirect Stdout to a File and Stderr to a Different File in Bash

If you want to redirect both stdout & stderr to separate files, you can check this example. Check out the following script to redirect stdout and stderr to a different file:

#! /bin/bash

{
 whoami
 whoami -l
} > output.txt 2> error.txt

echo "The output is '$(cat output.txt)'"
echo "The error is '$(cat error.txt)'"

EXPLANATION
In this script, the curly braces {…} are used to group the two whoami commands. Both of them are executed, with their stdout redirected (>) to the ‘output.txt’ file & stderr (if any) generated by them will be redirected (2>) to the error.txt file. Later I viewed the file contents with the help of the cat command while echoing messages (The output is & The error is) using the echo command.

Redirect stdout & stderr to different file in bashFrom the image, you can see the redirected stdout & stderr of the commands inside the two different files.

3. Append Both Stdout and Stderr to a File in Bash

You can append both stdout and stderr instead of just redirecting at the same time to the same file. This way the data will be appended to the specified file instead of overwriting it.

So, to append both stdout and stderr to a file using the append symbol >>, check out the following script:

#! /bin/bash

cat output.txt
whoami >> output.txt 2>&1
cat output.txt

EXPLANATION
The script appends the output & error messages of the whoami command to the output.txt files. Later, the cat command displays the new contents of the output.txt file after appending.

Appending stdout & stderr in bashSee from the image, the new output (munny) is appended with the previous file contents of the output.txt file.

4. Display Stdout on the Terminal and Redirect Stderr to a File in Bash

Sometimes you may need to display just the stdout of certain commands, not the error messages for a cleaner terminal. You can do that just by displaying the stdout & redirecting the stderr to a file.

See the below script to display stdout on the terminal and redirect stderr to a file:

#! /bin/bash

{
  date
  date -r /var/empty/foo
} 2> error.txt

EXPLANATION
In this script, the curly braces {…} are used to group the two date commands. Both of them are executed, with their stdout displayed on the terminal. But the 2> error.txt part ensures that any error messages generated by either of the date commands will be redirected to the error.txt file.

Displaying stdout & stderr to a file You can see the script only displays the stout of both commands, not the stderr. Later I viewed the error.txt file for viewing the error messages using the cat command.

5. Discard Stdout and Display Stderr on the Terminal

While working in Bash scripts, you may need to suppress certain command output, as you need only the error messages for debugging purposes. So instead of redirecting Stdout inside a file, you can just discard it.

Now the simplest and most common approach to suppress any output in Bash is by redirecting it to the null device, /dev/null. This special file in Unix-like systems discards all data written to it.

Now write the bash script to discard stdout and display stderr on the terminal:

#! /bin/bash

{
  whoami
  date
  date -r /var/empty/foo
} > /dev/null

EXPLANATION
In this script, the entire block of commands (whoami, date, date -r /var/empty/foo) within the curly braces {…} is grouped & their combined output will be redirected (>) to dev/null. This means the output messages will be discarded. But the generated stderr (if any) of these commands will still be displayed on the terminal.

Discarding stdout & displaying stderr in bashFrom the output image, you can see the script only displaying the error messages.

Conclusion

To sum up, whether you want to store, append, display, or discard the stdout and stderr of commands, the Bash redirection process helps to manage them. The discussed practical cases in this article should help you to learn how to handle them. Happy Bash scripting!

People Also Ask

Which is used to redirect stdout and stderr to a file?

To redirect stdout and stderr to the same file you can use the redirection operator &>. For that use the command syntax, command &> output.txt. Here, command is your desired command, of which you want to see the output & error information & output.txt is the file name to which both stdout & stderr will be redirected.

How to redirect both standard output and standard error to the same location?

You can redirect both standard output and standard error to the same location using the command syntax, command &> output.txt. Here, command is your desired command, of which you want to see the output & error information & output.txt is the file name to which both stdout & stderr will be redirected.

Which output redirection operator send output to both the screen and a file at the same time?

To redirect the output of a command both to the terminal & to a file you can use the tee command along with the pipe redirection operator (|). For example, if you want to view the ls command output to your terminal screen & also want to redirect the output to a file named output.txt, then use the command syntax, ls | tee output.txt.

Which character is used to redirect output to a file?

The redirection operator > is used to redirect output to a file. For example, if you want to redirect the ls command output to a file named ‘output.txt’, then use the command syntax, ls > output.txt.


Related Articles


<< Go Back to Bash RedirectionBash Redirection and Piping | Bash Scripting Tutorial

4.9/5 - (10 votes)
Monira Akter Munny

Hello!! This is Monira Akter Munny. I'm a Linux content developer executive here, at SOFTEKO company. I have completed my B.Sc. in Engineering from Rajshahi University of Engineering & Technology in the Electrical & Electronics department. I'm more of an online gaming person who also loves to read blogs & write. As an open-minded person ready to learn & adapt to new territory, I'm always excited to explore the Linux world & share it with you! Read Full Bio

Leave a Comment