如何在Ubuntu 22.04系统更新脚本内部集成tee,实现全程输出同时显示终端并写入文件?
如何在Ubuntu 22.04系统更新脚本内部集成tee,实现全程输出同时显示终端并写入文件?
嘿,我完全懂你不想反复写tee -a的烦躁,也希望不用每次手动加管道就能让脚本自动把所有输出同时打在终端和存进文件里,这有个超实用的办法帮你搞定:
你可以用exec命令在脚本开头就把整个脚本的标准输出和错误输出都重定向到tee,这样后面所有命令的输出都会自动同时走终端和日志文件,完全不用重复加tee参数。给你写个完整的示例脚本:
#!/bin/bash # 定义日志文件,也可以加时间戳避免覆盖旧日志,比如下面这样 # LOG_FILE="update_$(date +%Y%m%d_%H%M%S).out" LOG_FILE="update.out" # 设置一个环境变量标记,防止脚本被tee递归调用 if [ -z "$TEE_RUNNING" ]; then export TEE_RUNNING=1 # 将stdout和stderr都通过tee输出到屏幕和日志文件 exec > >(tee -a "$LOG_FILE") 2>&1 fi # 接下来就正常写你的更新命令就行,不用再管tee的事了 echo "=== 开始执行系统更新 - $(date) ===" echo -e "\n### 执行apt update:" apt update echo -e "\n### 执行apt升级:" apt upgrade -y echo -e "\n### 执行flatpak更新:" flatpak update -y echo -e "\n### 执行snap刷新:" snap refresh echo -e "\n=== 更新完成 - $(date) ==="
简单解释下原理:
exec > >(tee -a "$LOG_FILE")这行把脚本的标准输出(stdout)重定向到tee进程,tee会同时把内容输出到终端和追加到日志文件。2>&1是把标准错误输出(stderr)也重定向到和stdout一样的地方,这样错误信息也能被记录下来。- 环境变量
TEE_RUNNING是为了防止脚本被tee再次调用时进入无限循环——当脚本被自己的exec调用时,这个变量已经存在,就不会再执行重定向的逻辑了。
这样你只需要运行sudo ./update.sh,所有输出会实时显示在终端,同时自动保存到update.out里,完美解决你不想重复写命令的问题~
备注:内容来源于stack exchange,提问作者Carlos González
相关产品推荐
相关产品推荐

