我正在将脚本从 bash 转换为 zsh,并且已经在输出中苦苦挣扎了好几天。我希望 stdout 和 stderr 都转到控制台和日志文件。我已经尝试了网上能找到的所有方法,但没有任何乐趣。我已经阅读了 zsh 手册的重定向部分,但没有发现任何帮助,尽管我必须承认我不清楚。
以下是我在脚本开头附近尝试过的实验及其结果:
exec 2>&1 | tee -i test.log # everything in console, log created but empty
exec 2>&1 | tee -i > test.log # everything in console, log created but empty
exec 1>>$LOG; exec 2>&1 # everything in log, none in console
exec 2>&1; exec 1>>$LOG # console gets errors only; log stdout only
exec &> >(tee "$LOG") # works in bash, error in zsh
exec > >(tee -i ${LOG?}) 2>&1 # error
exec |& tee $LOG # error
exec > >(tee $LOG) 2>&1 # error
我还尝试了解 zsh 选项 multios,但无法理解它。它应该默认打开,但当我运行时,我在选项列表中找不到它setopt
。当我跑步时也没有setopt multios
。当我运行时unsetopt multios
,我看到了该选项nomultios
,但这似乎没有帮助
我知道已经有人提出并回答了类似的问题,但答案大多在上面的列表中,对我不起作用。
我认为这不相关,但我还设置了一个获取文件描述符 3 的调试日志。它仅适用于以 >&3 结尾的调试输出行。
任何寻找此类解决方案的人请注意:上述 exec 试验是用混乱的 shebang 完成的,并且纠正后的结果有点不同。除了下面 Gairfowl 的解决方案之外,这也有效:
exec > >(tee $LOG) 2>&1