linux错误输出重定向是shell提供的一种输出控制机制,用于将命令执行过程中产生的错误信息从默认的标准错误输出通道转移到指定的文件或者其他输出目标,避免错误信息直接打印到终端,方便后续查看和处理。

linux的标准输出通道
linux系统中每个运行的命令都有三个默认的标准输出通道,分别是标准输入、标准输出和标准错误输出,它们的文件描述符是固定的:
- 标准输入(stdin):文件描述符为0,默认从键盘读取输入内容
- 标准输出(stdout):文件描述符为1,默认将正常执行结果输出到终端
- 标准错误输出(stderr):文件描述符为2,默认将命令执行过程中的错误信息输出到终端
错误输出重定向就是针对文件描述符为2的标准错误输出进行的重定向操作。
常见错误输出重定向操作符
shell中提供了多个错误输出重定向相关的操作符,不同的操作符对应不同的功能:
| 操作符 | 功能说明 |
|---|---|
| 2> | 将标准错误输出重定向到指定文件,会覆盖文件原有内容 |
| 2>> | 将标准错误输出重定向到指定文件,会追加到文件末尾 |
| 2>&1 | 将标准错误输出重定向到标准输出当前指向的目标 |
| > 文件 2>&1 | 将标准输出和标准错误输出都重定向到同一个文件 |
| &> | 等价于> 文件 2>&1,是bash的简化写法 |
错误输出重定向使用示例
1. 将错误输出重定向到文件
当我们执行一个不存在的命令时,系统会输出错误提示,默认会打印到终端:
# 执行不存在的命令,错误直接输出到终端 ls not_exist_file # 终端会显示:ls: cannot access 'not_exist_file': No such file or directory
如果希望把这个错误信息保存到文件里,可以使用2>操作符:
# 将错误输出重定向到error.log文件 ls not_exist_file 2> error.log # 终端不会显示错误信息,查看error.log文件可以看到错误内容 cat error.log
2. 追加错误输出到文件
如果需要多次执行命令,并且把每次的错误信息都保存下来,不覆盖之前的内容,可以使用2>>操作符:
# 第一次执行,错误写入error.log ls file1 2>> error.log # 第二次执行,错误追加到error.log末尾 ls file2 2>> error.log # 查看error.log可以看到两条错误信息 cat error.log
3. 合并标准输出和错误输出
有时候我们需要把命令的正常输出和错误输出都保存到同一个文件,这时候可以使用&>或者2>&1的写法:
# 方法一:使用&>操作符 ls exist_file not_exist_file &> all_output.log # 方法二:使用2>&1 ls exist_file not_exist_file > all_output.log 2>&1 # 查看文件可以看到正常输出和错误信息都在里面 cat all_output.log
4. 丢弃错误输出
如果我们不希望看到错误信息,也不想保存,可以将错误输出重定向到/dev/null,这个设备会丢弃所有写入的内容:
# 执行命令,错误输出被丢弃,终端不会显示任何错误 ls not_exist_file 2> /dev/null
错误输出重定向的常见应用场景
- shell脚本错误处理:在脚本中把错误信息保存到日志文件,方便后续排查问题,避免错误信息干扰脚本的正常输出
- 定时任务输出处理:linux的crontab定时任务执行时默认不会输出到终端,通过错误输出重定向可以把错误信息保存到指定位置,便于监控任务执行状态
- 批量命令执行:执行批量操作时,把错误信息单独收集,不影响正常结果的查看
注意事项
- 错误输出重定向的操作符
2>和2>>的数字2不能省略,否则会被识别为正常输出重定向 - 不同shell对
&>操作符的支持不同,bash和zsh支持,但是sh可能不支持,兼容性要求高的场景建议使用2>&1的写法 - 重定向操作符和文件路径之间可以有空格,也可以没有,比如
2>error.log和2> error.log都是合法的
错误输出重定向是linux shell操作的基础技能,熟练掌握后可以更灵活地控制命令输出,提升日常操作和脚本编写的效率。