使用exec重定向可统一接管脚本所有输出:exec > logfile.txt 2>&1(覆盖)或exec >> logfile.txt 2>&1(追加),确保不遗漏;单条命令重定向灵活但易漏;tee支持实时显示并保存;stdout与stderr可分开或合并记录。
直接在脚本开头用 exec 重定向整体会更稳妥,比逐条命令加 > 更省心、不易遗漏。
用 exec 统一接管脚本所有输出
在 Shell 脚本第一行(#!/bin/bash 下方)加上这句,就能把后续所有 stdout 和 stderr 都写入指定日志文件:
-
exec > logfile.txt 2>&1—— 覆盖式写入,每次运行清空旧内容再写 -
exec >> logfile.txt 2>&1—— 追加式写入,保留历史记录,适合长期运行或调试
注意:2>&1 必须写在后面,表示“把标准错误(2)重定向到当前标准输出(1)的位置”,也就是同一个文件。顺序不能颠倒。
单条命令临时重定向
如果只对某几行输出做保存,可以直接在命令末尾加重定向符号:
-
echo "服务启动" > app.log—— 覆盖写入 -
date >> app.log—— 追加时间戳 -
ls -l /tmp 2>> app.log—— 只追加错误信息(比如权限拒绝)
这类写法灵活,但容易漏掉某些命令的输出,不适合需要完整日志的场景。
边看边存:用 tee 实时显示并落盘
想在终端看到输出的同时也保存下来,用 tee 最合适:
-
./deploy.sh | tee deploy.log—— 运行脚本,实时打印+保存 -
./deploy.sh 2>&1 | tee -a deploy.log—— 把 stdout 和 stderr 一起捕获并追加
特别适合调试阶段:不用反复翻日志,也能确保有完整记录。
区分正常输出和错误日志
把 stdout 和 stderr 分开保存,便于排查问题:
-
./build.sh > build.out 2> build.err—— 正常流程进out,报错进err -
./build.sh > build.log 2>&1—— 合并在一个文件里,按时间顺序混排
分开保存适合自动化检查(比如监控 build.err 是否为空),合并在一个文件更适合人工快速浏览全流程。


















