如何在Bash脚本内部实现输出同时定向到控制台与文件?
Bash脚本实现输出同时到控制台和文件
方法一:重定向整个脚本的所有输出
如果希望脚本里所有的标准输出(stdout)和错误输出(stderr)都同时显示在终端并写入文件,可以用exec结合进程替换实现:
#!/bin/bash LOG_FILE="/tmp/script_full_output.log" # 配置输出重定向:stdout和stderr都通过tee输出到终端和日志文件 exec > >(tee -a "$LOG_FILE") 2>&1 # 以下是你的脚本业务代码 echo "正常执行信息" ls /nonexistent/path # 会产生错误输出 echo "脚本执行完成"
> >(tee -a "$LOG_FILE"):把脚本的stdout重定向到tee命令的输入,tee会同时将内容输出到终端和追加到日志文件(-a是追加模式,不加则覆盖)。2>&1:把stderr重定向到当前的stdout,这样错误信息也会被tee处理。
方法二:仅重定向部分代码块的输出
如果只需要捕获脚本中某一段代码的输出,用大括号包裹代码块,再结合进程替换:
#!/bin/bash LOG_FILE="/tmp/partial_output.log" # 仅捕获这个代码块内的输出 { echo "开始执行核心逻辑" grep "test" /etc/passwd echo "核心逻辑执行结束" >&2 } > >(tee -a "$LOG_FILE") 2>&1 # 这段代码的输出只会显示在终端,不会写入日志 echo "脚本后续执行内容"
常见错误纠正
你之前尝试的{...} > tee file无效,是因为>后面需要指向文件或文件描述符,而tee是命令,必须用进程替换>(tee ...)才能把输出传递给tee命令处理。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

