In Bash, 2>&1
is a redirection operator that combines the standard error (stderr) stream with the standard output (stdout) stream. Here’s a breakdown:
Explanation
2>
: Redirects stderr (file descriptor2
).&1
: Points to the current destination of stdout (file descriptor1
).
Effect: Sends error messages (stderr
) to the same place as normal output (stdout
).
Examples
1. Redirect Both stdout and stderr to a File
command > output.txt 2>&1
> output.txt
: Redirects stdout tooutput.txt
.2>&1
: Redirects stderr to the same place as stdout (output.txt
).
2. Pipe Both stdout and stderr to Another Command
command 2>&1 | grep "error"
2>&1
: Combines stderr and stdout.| grep "error"
: Pipes both streams togrep
.
3. Suppress All Output (Redirect to /dev/null
)
command > /dev/null 2>&1
- Redirects stdout and stderr to the “black hole” device (
/dev/null
).
Key Notes
- Order Matters: Redirections are processed left-to-right.
# Wrong: stderr still goes to the terminal
command 2>&1 > output.txt
# Correct: both streams go to output.txt
command > output.txt 2>&1
- Shortcut: Use
&>
for simplicity (Bash 4+):
command &> output.txt # Same as > output.txt 2>&1
Why Use 2>&1
?
- Capture errors and output in the same log file.
- Debug scripts by seeing both streams in the terminal.
- Pipe combined output to tools like
grep
orawk
.
Common Mistakes
2>1
: Redirects stderr to a file named1
(not the same as2>&1
).- Forgetting the
&
in&1
, which refers to the stdout file descriptor.