如何实现Bash脚本终端同步输出与多日志文件记录?
跨系统配置脚本多日志记录实现方案
需求说明
- 脚本执行时,终端同步显示
stdout和stderr内容 - 将所有
stdout和stderr合并记录到provision-full.log文件 - 单独将
stderr记录到provision-err.log文件
现有情况
现有脚本框架
#!/bin/bash # defining functions { # some script here } |& tee ~/full-provision.log
已实现的近似方案
- 本地虚拟机:使用
|& tee ~/full-provision.log,实现终端查看输出+合并日志,但无法单独捕获stderr - AWS EC2虚拟机:使用
2> /var/log/provision-err.log > /var/log/provision-out.log,生成独立日志,但终端无法同步显示内容
可行性结论
该需求完全可行,不存在系统设计层面的限制。通过Bash的文件描述符重定向与进程替换机制,可同时实现终端同步输出与多分支日志记录。
最终实现脚本
以下是适配本地与AWS EC2环境的通用脚本结构:
#!/bin/bash # 可根据环境调整日志路径:本地用~/,EC2用/var/log/ FULL_LOG="~/provision-full.log" ERR_LOG="~/provision-err.log" # 核心执行逻辑 { # 此处放置你的脚本内容(函数定义、配置命令等) # 示例测试代码: echo "这是标准输出内容" >&2 echo "这是错误输出内容" } 1> >(tee -a "$FULL_LOG") 2> >(tee -a "$ERR_LOG" "$FULL_LOG" >&2)
方案解释
终端同步显示
1> >(tee -a "$FULL_LOG"):将stdout写入FULL_LOG的同时,保留内容输出到终端2> >(tee -a "$ERR_LOG" "$FULL_LOG" >&2):将stderr同时写入ERR_LOG和FULL_LOG,并将内容重定向回终端显示
日志记录规则
provision-full.log:包含所有stdout和stderr内容provision-err.log:仅包含stderr内容
该脚本兼容绝大多数Linux环境(包括本地虚拟机与AWS EC2实例),只要使用Bash 4.0及以上版本即可正常运行(主流Linux发行版均满足此条件)。
内容的提问来源于stack exchange,提问作者mono
相关产品推荐
相关产品推荐

