一、基础概念
- 标准输入 (stdin):文件描述符
0,默认来自键盘输入。 - 标准输出 (stdout):文件描述符
1,默认输出到终端。 - 标准错误 (stderr):文件描述符
2,默认输出到终端。
二、输出重定向
1. 覆盖重定向
| 操作符 | 功能 | 示例 |
|---|
> 或 1> | 覆盖重定向标准输出 | ls > files.txt |
2> | 覆盖重定向标准错误 | ls /invalid 2> error.log |
2. 追加重定向
| 操作符 | 功能 | 示例 |
|---|
>> 或 1>> | 追加标准输出 | echo "new" >> files.txt |
2>> | 追加标准错误 | ls /invalid 2>> error.log |
3. 合并输出流
| 操作符 | 功能 | 示例 |
|---|
&> 或 >& | 合并标准输出和错误到同一文件 | command &> output.log |
2>&1 | 将标准错误重定向到标准输出 | command > output.log 2>&1 |
三、输入重定向
| 操作符 | 功能 | 示例 |
|---|
< | 从文件读取输入 | sort < input.txt |
<< | Here Document(多行输入) | 见下方示例 |
<<< | Here String(字符串输入) | tr 'a-z' 'A-Z' <<< "hello" |
Here Document 示例:
mail -s "Alert" admin@example.com << EOF
系统检测到异常!
时间: $(date)
EOF
四、特殊设备与技巧
1. /dev/null
2. tee
3. 管道 (|)
五、高级用法
1. 重定向顺序
2. 临时重定向代码块
{
echo "--- 开始执行 ---"
ls /invalid
echo "--- 结束执行 ---"
} > output.log 2>&1
3. 文件描述符操作
exec 3>file.txt # 打开文件描述符3
echo "内容" >&3 # 写入到描述符3
exec 3>&- # 关闭描述符3
六、典型场景
1. 日志记录
# 记录所有输出(覆盖模式)
./script.sh > script.log 2>&1
# 记录所有输出(追加模式)
./script.sh >> script.log 2>&1
2. 分离正常与错误输出
# 正常输出到文件,错误输出到屏幕
command > output.log
# 正常输出到文件,错误输出到另一文件
command > output.log 2> error.log
3. 忽略非关键错误
# 忽略“文件不存在”错误
rm *.tmp 2>/dev/null
4. 多命令协作
# 生成文件列表并压缩
find . -name "*.log" > list.txt 2>/dev/null
tar -czf logs.tar.gz -T list.txt
七、注意事项
- 权限问题:确保对目标文件有写入权限。
- 路径存在性:目标文件目录必须存在。
- 覆盖风险:使用
> 前确认是否需要备份原文件。 - 性能优化:避免频繁写入小文件,可批量处理。
通过灵活组合这些重定向技巧,可以高效控制数据流,满足日志记录、批量处理、错误隔离等需求。