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

为何以sudo运行该Bash脚本时控制台无stdout输出?

解决sudo运行脚本时无控制台输出的问题

问题核心是原脚本的重定向逻辑在sudo环境下,无法将内容输出到用户终端。原因是sudo运行时,脚本的标准输出/错误的关联对象发生变化,导致tee的输出没有指向原始终端。

修改后的脚本

#!/bin/bash

# 定义重定向stdout和stderr到终端与日志的函数
redirect_both_to() {
    local log_file=logfile.log
    # 保存原始终端的stdout和stderr到文件描述符3、4
    exec 3>&1 4>&2
    # 重定向stdout:tee写入日志的同时,将内容输出到原始stdout(fd3)
    exec > >(tee -a "$log_file" >&3)
    # 重定向stderr:tee写入日志的同时,将内容输出到原始stderr(fd4)
    exec 2> >(tee -a "$log_file" >&4)
    # 关闭临时保存的文件描述符,避免资源泄漏
    exec 3>&- 4>&-
}


# 示例函数
one() {
    echo "This is from one()"
    echo "Error message from one()" >&2
}

two() {
    echo "This is from two()"
    echo "Error message from two()" >&2
}

# 主执行逻辑
function main(){
    redirect_both_to
    one
    two
}

main "$@"

关键修改点说明

  • 新增exec 3>&1 4>&2:将当前的终端stdout、stderr分别保存到文件描述符3和4,用于记住原始终端的输出通道。
  • 调整tee的输出目标:让tee在写入日志文件后,将内容重定向到保存的原始文件描述符,确保无论是否通过sudo运行,内容都能输出到用户终端。
  • 修正错误输出通道:原脚本中错误信息未明确指向stderr,这里改为>&2,让错误信息正确走stderr通道,符合日志记录逻辑。

修改后,直接运行或通过sudo ./script.sh运行脚本,控制台都会正常输出内容,同时日志文件也会完整记录stdout和stderr的信息。

内容的提问来源于stack exchange,提问作者investigate311

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:15:02