You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:45:09