Bash 输出重定向入门:日志和错误分别去了哪里?

举报
yd_263910519 发表于 2026/11/01 13:10:41 2026/11/01
【摘要】 通过小练习理解 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 根据状态分支,并保留必要日志。排查时结合状态、输出和操作时间分析,不要只凭一个空的错误文件下结论。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。