Intermediate
File Descriptors - Intermediate
Combining and Duplicating Streams
The &
Notation
The &
in redirections means "file descriptor":
# Redirect stderr to wherever stdout is going
command 2>&1
# Shorthand: redirect both stdout and stderr to file
command &> output.txt # Same as: command > output.txt 2>&1
command &>> output.txt # Append version
Order Matters!
# WRONG: stderr still goes to terminal
command > file.txt 2>&1 # Correct order
command 2>&1 > file.txt # WRONG: stderr goes to original stdout
Common Patterns
Silencing Output
# Discard all output
command > /dev/null 2>&1
# Discard only errors
command 2> /dev/null
# Discard output but keep errors
command > /dev/null
Logging Patterns
#!/bin/bash
# log-wrapper.sh - Log all output while still displaying it
# Log both stdout and stderr to file while showing on screen
./mycommand 2>&1 | tee output.log
# Separate error logging
./mycommand 2> >(tee -a error.log >&2) | tee -a output.log
Conditional Output
# verbose.sh - Control output verbosity
VERBOSE=${VERBOSE:-0}
debug() {
[ "$VERBOSE" -eq 1 ] && echo "[DEBUG] $*" >&2
}
info() {
echo "[INFO] $*"
}
error() {
echo "[ERROR] $*" >&2
}
# Usage
debug "This only shows if VERBOSE=1"
info "This always shows"
error "This goes to stderr"
Reading and Writing Simultaneously
# Process a file in-place (careful!)
while IFS= read -r line; do
echo "PROCESSED: $line"
done < input.txt > temp.txt && mv temp.txt input.txt
Backlinks