为何以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
相关产品推荐
相关产品推荐

