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合并到stdouttee 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.txt2> >(tee log1_stderr.txt >&2):将stderr通过tee输出到终端和log1_stderr.txt,>&2保证stderr的输出仍然走终端的错误通道(部分终端会用不同颜色标识)
内容的提问来源于stack exchange,提问作者BTBts
相关产品推荐
相关产品推荐

