Bash 输出重定向入门:日志和错误分别去了哪里?
运行命令时,有些信息显示在屏幕上,有些需要保存供排查。Bash 的重定向可以改变输出去向。理解标准输出、标准错误和退出状态,能让日志更容易读。
一、准备练习目录
以下示例使用 Bash。先在自己的工作目录中新建一个空目录,避免覆盖已有文件:
mkdir redirect-demo
cd redirect-demo
标准输出通常发送正常结果,编号为 1;标准错误通常发送诊断信息,编号为 2。两者默认往往都显示在终端,因此看上去像同一条输出。具体写到哪里由程序决定。
二、分别保存两类输出
在练习目录创建 demo.sh,写入以下两行:
printf '%s\n' '这是普通输出'
printf '%s\n' '这是一条诊断信息' >&2
接着运行:
bash demo.sh > output.txt 2> errors.txt
cat output.txt
cat errors.txt
第一行输出进入 output.txt,第二行进入 errors.txt。符号 > 默认重定向标准输出,2> 指定标准错误。打印诊断信息本身并不自动意味着命令失败。
三、覆盖与追加
单个 > 会在命令执行前创建或截断目标文件;>> 在文件末尾追加。要保留多次运行的内容,可以执行:
bash demo.sh >> output.txt 2>> errors.txt
再次查看文件,新内容会出现在末尾。对真实日志操作前,先核对路径和重定向符号;错误使用 > 可能清空已有文件。练习时只使用自己创建的文件。
四、合并输出时注意顺序
如果希望两种输出都进入一个文件,可以运行:
bash demo.sh > combined.txt 2>&1
Bash 从左到右处理重定向:先把标准输出指向文件,再让标准错误指向此时的标准输出位置。若反过来写成 2>&1 > combined.txt,标准错误先指向原来的标准输出位置,随后只有标准输出改到文件,因此结果可能不同。这个顺序在保存构建或任务日志时很有用。
五、检查退出状态
输出文字与退出状态是两回事。Bash 中上一条命令的状态可以通过 $? 查看,通常 0 表示成功,非零表示失败。请紧接着查看,因为执行其他命令会更新它:
bash demo.sh > output.txt 2> errors.txt
printf '退出状态:%s\n' "$?"
这里脚本成功打印了一条诊断信息,但退出状态仍可能为 0。实际脚本可用 if 命令; then ... else ... fi 根据状态分支,并保留必要日志。排查时结合状态、输出和操作时间分析,不要只凭一个空的错误文件下结论。
- 点赞
- 收藏
- 关注作者
评论(0)