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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:54:55