Linux重定向是Shell环境里用来改变命令输入输出流向的功能,默认情况下命令会从标准输入读取数据,把结果输出到标准输出,错误信息输出到标准错误,通过重定向可以调整这些流向,适配不同的使用需求。
Linux重定向的基础分类
Linux系统默认有三个标准文件描述符,对应的重定向方式也围绕这三个描述符展开:
- 标准输入:文件描述符为0,默认从键盘读取输入
- 标准输出:文件描述符为1,默认输出到终端屏幕
- 标准错误:文件描述符为2,默认错误信息输出到终端屏幕
1. 标准输出重定向
标准输出重定向可以把命令的正常执行结果输出到指定文件,覆盖原有文件内容,语法是命令 > 目标文件,如果不写文件描述符1,默认就是标准输出重定向。
比如把ls命令的结果输出到test.txt文件里:
# 执行ls命令,结果覆盖写入test.txt,不会在终端显示 ls -l > test.txt # 等价于下面这种显式指定文件描述符的写法 ls -l 1> test.txt
2. 标准错误重定向
标准错误重定向用来把命令执行产生的错误信息输出到指定文件,语法需要显式指定文件描述符2,写成命令 2> 目标文件。
比如执行一个不存在的命令,把错误信息写入err.log:
# 执行不存在的命令,错误信息覆盖写入err.log no_command 2> err.log
3. 标准输入重定向
标准输入重定向可以让命令从指定文件读取内容,而不是从键盘输入,语法是命令 < 源文件,文件描述符0可以省略。
比如用wc -l统计test.txt的行数,从文件读取内容:
# 统计test.txt的行数,从test.txt读取输入 wc -l < test.txt # 等价于显式指定文件描述符的写法 wc -l 0< test.txt
常用的扩展重定向方式
追加重定向
默认的>重定向会覆盖目标文件的原有内容,如果需要在文件末尾追加内容,可以使用>>符号,同样分为标准输出追加和标准错误追加。
示例:
# 把ls结果追加到test.txt末尾,不覆盖原有内容 ls -a >> test.txt # 把错误信息追加到err.log末尾 wrong_command 2>> err.log
合并标准输出和标准错误
有时候需要把命令的正常输出和错误信息都写入同一个文件,有两种常见的实现方式:
- 方式一:先把标准错误重定向到标准输出,再把标准输出重定向到文件,语法是
命令 > 目标文件 2>&1 - 方式二:使用
&>符号直接合并重定向,语法是命令 &> 目标文件
示例:
# 方式一:合并输出到all.log ls -l /nonexist > all.log 2>&1 # 方式二:合并输出到all.log,等价于上面的写法 ls -l /nonexist &> all.log
重定向到/dev/null
/dev/null是Linux系统的空设备文件,写入这个文件的内容都会被丢弃,如果需要忽略命令的输出或错误信息,可以将其重定向到/dev/null。
比如忽略错误信息的示例:
# 执行命令,忽略所有错误信息,正常输出还是会显示在终端 ls /nonexist 2> /dev/null
不同重定向方式的适用场景对比
不同重定向方式的适用场景可以参考下表:
| 重定向方式 | 语法示例 | 适用场景 |
|---|---|---|
| 标准输出覆盖重定向 | cmd > file | 需要把命令结果保存到新文件,不需要保留原有文件内容时 |
| 标准输出追加重定向 | cmd >> file | 需要把多次命令的结果累积保存到同一个文件时 |
| 标准错误重定向 | cmd 2> file | 需要单独记录命令执行的错误信息,不干扰正常输出时 |
| 合并重定向 | cmd &> file | 需要同时记录命令的正常输出和错误信息,统一保存到文件时 |
| 标准输入重定向 | cmd < file | 命令需要读取外部文件内容作为输入,不需要手动键盘输入时 |
| 重定向到/dev/null | cmd > /dev/null | 不需要查看命令的输出或错误信息,只想执行命令本身时 |
注意事项
在使用重定向时需要注意几个常见的问题:
- 重定向符号两边的空格不是必须的,比如
ls>test.txt也可以正常执行,不过建议加上空格提升可读性 - 文件描述符和重定向符号之间不能有空格,比如
2> err.log是正确的,2 > err.log会被解析为把文件描述符2作为命令参数,再把结果重定向到err.log,会出现不符合预期的结果 - 合并重定向时
2>&1要放在> file后面,如果顺序反过来,会先把标准错误重定向到终端,再重定向标准输出到文件,达不到合并的效果
重定向是Linux Shell的基础功能,熟练掌握后可以大幅提升命令操作的效率,也可以在编写Shell脚本时更灵活地控制输入输出逻辑。