如何让Shell脚本仅输出指定内容到stdout,完整内容存日志?
实现Shell脚本分输出:全量日志记录+指定内容输出到终端
核心思路
先保存终端原本的标准输出(stdout),再将脚本的**所有输出(包括stdout和stderr)**统一重定向到日志文件。之后,仅对需要显示在终端的内容,单独输出到之前保存的原始stdout通道。
具体实现代码
#!/bin/bash # 保存原始stdout到文件描述符3 exec 3>&1 # 将脚本所有输出(stdout+stderr)重定向到日志文件 exec &> complete-output.log # 示例:普通命令,仅写入日志,不显示在终端 echo "这条消息只会进日志,不会显示在屏幕" ls /nonexistent-path # 错误信息也会被写入日志 # 需要显示在终端的内容,输出到文件描述符3 echo "这条消息会同时出现在日志和终端" >&3 echo "重要提示:脚本执行到关键步骤了" >&3 # 恢复原始stdout(可选,脚本结束前执行即可) exec 3>&-
关键逻辑解释
exec 3>&1:把当前终端的stdout复制到文件描述符3,相当于给终端输出留了一个专属通道。exec &> complete-output.log:将后续所有的标准输出和错误输出都重定向到日志文件,确保脚本的全量操作都被记录。>&3:把指定内容输出到之前保存的原始stdout(终端屏幕),同时因为脚本的全局重定向设置,该内容也会同步写入日志文件。exec 3>&-:关闭文件描述符3,释放系统资源。
简化写法:自定义函数封装
如果需要频繁输出终端可见内容,可以封装成函数减少重复代码:
#!/bin/bash exec 3>&1 exec &> complete-output.log # 定义函数:内容同时写入日志和终端 log_and_echo() { echo "$1" >&3 } # 普通日志输出(仅写入日志) echo "脚本启动时间:$(date)" # 终端可见的输出 log_and_echo "脚本开始执行核心任务..." log_and_echo "核心任务执行完成,结果符合预期"
内容的提问来源于stack exchange,提问作者Keval Bhogayata
相关产品推荐
相关产品推荐

