Bash环境下如何将Stdout输出到终端,同时将Stdout+Stderr写入文件?
问题核心:你没抓住set -x的输出本质!
set -x的调试输出是Shell自身的日志,不是你执行的command的标准错误(stderr)——这就是你之前各种组合失效的关键!普通的命令重定向只能抓命令自身的流,抓不到Shell层面的调试输出。
下面给你两种靠谱的解决方案:
方案1:子Shell捕获调试输出(最简单)
直接用带-x参数的bash子Shell执行命令,把子Shell的stderr(也就是set -x的输出)追加到文件,同时让命令的stdout通过tee既输出到终端又写入文件:
bash -x -c '你的命令' 2>> output.txt | tee -a output.txt
举个实际例子,比如执行echo "Hello Stack Overflow":
bash -x -c 'echo "Hello Stack Overflow"' 2>> output.txt | tee -a output.txt
效果:
- 终端只会显示
Hello Stack Overflow output.txt里会包含调试日志和命令输出:+ echo Hello Stack Overflow Hello Stack Overflow
方案2:当前Shell内实现(无需子Shell)
如果不想启动新Shell进程,适合在脚本里用,可以通过文件描述符重定向来保存和恢复终端流:
# 先把当前的stderr和stdout存到临时文件描述符 exec 3>&2 4>&1 # 把Shell的stderr(set -x的输出)定向到文件 exec 2>> output.txt # 开启调试模式 set -x # 执行命令:stdout输出到终端,同时追加到文件 你的命令 | tee -a output.txt # 恢复原来的stderr/stdout,清理临时描述符 exec 2>&3 1>&4 exec 3>&- 4>&-
内容的提问来源于stack exchange,提问作者elenhil
相关产品推荐
相关产品推荐

