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

Zsh主脚本调用子脚本时如何同时输出到终端与日志文件?

Zsh下实现子脚本输出同时到终端和日志文件

你的重定向写法有误,导致所有输出都只写入日志文件,终端没有内容。以下是正确的实现方式:

错误原因分析

你当前的命令./run_script1.sh >&1 log1.txt 2>&1语法不正确,实际效果是将标准输出(stdout)重定向到log1.txt,再将标准错误(stderr)重定向到stdout(也就是log1.txt),所以所有输出都被写入文件,终端无输出。

正确实现方法

使用tee命令,它可以将输入同时输出到终端和指定文件。针对不同需求有两种写法:

1. 同时捕获stdout和stderr到同一日志文件

这是最常用的场景,将子脚本的所有输出(正常输出+错误信息)同时打印到终端并写入日志:

./run_script1.sh 2>&1 | tee log1.txt
./run_script2.sh 2>&1 | tee log2.txt
  • 2>&1:将stderr合并到stdout
  • tee log1.txt:将合并后的输出同时输出到终端和log1.txt

2. 保留子脚本的退出状态

如果需要获取子脚本的执行结果(退出码),Zsh中可以通过$pipestatus数组获取管道中第一个命令的状态:

./run_script1.sh 2>&1 | tee log1.txt
script_exit_code=$pipestatus[1]
# 根据退出码做后续处理
if [[ $script_exit_code -ne 0 ]]; then
    echo "run_script1.sh执行失败,退出码:$script_exit_code"
fi

3. 分开捕获stdout和stderr到不同文件(可选)

如果需要将正常输出和错误信息分别写入不同日志,同时都输出到终端,可以这样写:

./run_script1.sh > >(tee log1_stdout.txt) 2> >(tee log1_stderr.txt >&2)
  • > >(tee log1_stdout.txt):将stdout通过tee输出到终端和log1_stdout.txt
  • 2> >(tee log1_stderr.txt >&2):将stderr通过tee输出到终端和log1_stderr.txt,>&2保证stderr的输出仍然走终端的错误通道(部分终端会用不同颜色标识)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:40:31