每个进程都有三个标准文件描述符:stdin(标准输入)、stdout(标准输出)和stderr(标准错误)。默认情况下,stderr会输出到终端。使用2>
可以将stderr重定向到其他地方,比如文件或者设备文件。/dev/null
作为一个字符设备,所有写入它的数据都会被丢弃,不会保存在任何地方,因此执行命令时产生的错误信息就不会显示出来,也不会保存在日志文件中。
重定向符号 | 功能 | 典型示例 |
---|---|---|
> |
覆盖式写入文件 | echo "test" > output.txt |
>> |
追加式写入文件 | echo "test" >> output.txt |
2> |
重定向标准错误到文件 | ls /dir 2> errors.log |
2>&1 |
将标准错误合并到标准输出 | `cat file 2>&1 |
>/dev/null |
静默丢弃标准输出 | rm -rf /tmp >/dev/null |
2>/dev/null |
静默丢弃标准错误(本文重点) | find * 2>/dev/null |
# 将错误信息记录到日志文件
command 2> /var/log/command_errors.log
每个进程维护的文件描述符表:
0: stdin(键盘输入)
1: stdout(屏幕输出)
2: stderr(错误输出)
command 2> /var/log/command_errors.log
是将标准错误(stderr,文件描述符2)重定向到指定的日志文件。
command 1> /var/log/command_errors.log
是将标准输出(stdout,文件描述符1)重定向到同一个日志文件
command 0> /var/log/command_errors.log
是将标准输入(stdin,文件描述符0)重定向到日志文件。
同时重定向 stdout 和 stderr
# 使用 &> 同时重定向两个流到同一文件(覆盖模式)
command &> /var/log/command.log
# 使用 >> 追加模式(保留历史记录)
command >> /var/log/command.log
2. 分离输出流和错误流
# 将 stdout 记录到日志,stderr 显示在终端
command 1> /var/log/output.log 2>&1
# 将 stderr 记录到日志,stdout 显示在终端
command 2> /var/log/error.log 1>&2
将所有输出全部存到日志
1. 同时重定向标准输出(stdout)和标准错误(stderr)
bash
command > log.txt 2>&1
- 说明:
>
:重定向标准输出到文件(覆盖模式)2>&1
:将标准错误流重定向到标准输出的位置(即log.txt
)
- 效果:
- 所有输出(包括错误信息)都保存到
log.txt
- 屏幕上不再显示任何输出
- 所有输出(包括错误信息)都保存到
#!/bin/bash
exec > log.txt 2>&1 # 重定向所有输出到 log.txt
set -o pipefail # 确保管道命令失败时脚本终止