Redirecting output streams is a common need in Unix and Linux environments, especially when you want to log command outputs for analysis or debugging. Sometimes, you might want to redirect the standard output (stdout) or the standard error (stderr) to not just one, but multiple files simultaneously. In this article, I’ll explain how to accomplish this efficiently using the tee
command.
How to Redirect the Standard Output (stdout) to Multiple Files
The tee
command reads from standard input and writes the output to multiple files, as well as to standard output. This makes it an excellent tool for duplicating outputs.
Basic Syntax
You can redirect stdout to multiple files using:
command | tee file1 file2
Example:
echo "hello" | tee f1 f2
This will display “hello” on the terminal and write it to both f1
and f2
files.
Explanation and Practical Use Cases
The tee
command acts like a “T-junction” in plumbing, splitting the output stream into multiple directions. It’s particularly useful when you want to monitor a command’s output in real time while also saving it for later review.
For instance, when running long scripts, you might want the live output for monitoring and a complete record saved in files for auditing or debugging purposes.
You can also use tee
with file append mode by using the -a
option, like so:
echo "new line" | tee -a f1 f2
This appends the output rather than overwriting the existing files.
Copying Files to Multiple Destinations
You can duplicate files to multiple locations using tee
. For example, to copy /etc/passwd
to two different backup files:
cat /etc/passwd | tee /home/mike/pwbackup /root/pwbackup
This command reads the content of /etc/passwd
and writes it simultaneously to both /home/mike/pwbackup
and /root/pwbackup
.
Such duplication is useful for creating redundant backups or distributing configuration files across various directories.
Another example: copying a configuration file to user-specific directories simultaneously without running multiple commands.
How to Redirect the Standard Error (stderr) to Multiple Files
Unlike stdout, the tee
command by default cannot capture stderr. To redirect stderr, we first need to redirect it to stdout.
Basic Syntax
The general form is:
command 2>&1 | tee file1 file2
Example:
gcc 2>&1 | tee f1 f2
If gcc
is run without input files, it will produce an error message. With the above command, the error output will be displayed on the screen and written to f1
and f2
.
How It Works
2>&1
redirects stderr (file descriptor 2) to stdout (file descriptor 1).tee
then captures the combined stream and writes it to the specified files.
This technique is extremely handy when compiling large projects or running complex scripts where both stdout and stderr outputs need to be logged for debugging.
You can also use this method in scripts to capture everything a script outputs, whether successful messages or error messages.
For persistent appending of both outputs, you could use:
somecommand 2>&1 | tee -a errorlog.txt
Advanced Example with Logs
If you are running a program that produces both regular output and error output, and you want them saved separately and together, you can chain commands like this:
somecommand > >(tee stdout.log) 2> >(tee stderr.log >&2)
This advanced syntax allows for separate logging of stdout and stderr while still displaying them on the screen.
Conclusion
Redirecting both stdout and stderr to multiple files can be extremely useful for logging, debugging, and monitoring. By mastering the tee
command and understanding how to manage output streams, you can make your workflows much more robust and reliable.
Always ensure you understand which stream (stdout or stderr) you are dealing with, and remember that tee
only works with what it receives via stdin unless you explicitly redirect stderr to stdout. Combining these techniques gives you powerful control over your command-line operations.
With these skills, you’ll find it much easier to troubleshoot, automate, and document your Unix/Linux work!
Pingback: How to Use the echo Command in Shell Scripting - iDoLinux
Pingback: Bash !$ Trick: Insert the Last Argument of the Previous Command - iDoLinux
Pingback: How to Use the echo Command in Shell Scripting - Open Source Software News