Zsh脚本实现stdout与stderr同时输出至控制台和日志文件的问题求助
Zsh脚本实现stdout与stderr同时输出至控制台和日志文件的问题求助
我最近在把bash脚本转成zsh脚本,折腾好几天都搞不定输出的问题——我想让stdout和stderr同时输出到控制台,还要写入到同一个日志文件里。网上能找到的方法我都试了个遍,就是不行。我也看了zsh手册里的重定向部分,但说实话没看明白,没找到有用的信息。
下面是我在脚本开头尝试过的几种写法,以及对应的结果:
exec 2>&1 | tee -i test.log:所有内容都输出到控制台,日志文件创建了但是空的exec 2>&1 | tee -i > test.log:所有内容都输出到控制台,日志文件创建了但是空的exec 1>>$LOG; exec 2>&1:所有内容都进了日志文件,控制台啥都没有exec 2>&1; exec 1>>$LOG:控制台只显示错误信息,日志文件里只有标准输出内容exec &> >(tee "$LOG"):在bash里能用,但zsh里报错exec > >(tee -i ${LOG?}) 2>&1:报错exec |& tee $LOG:报错exec > >(tee $LOG) 2>&1:报错
我还试着去理解zsh的multios选项,但没搞懂。按理说它默认是开启的,但我运行setopt的时候没看到这个选项;就算手动执行setopt multios,再查还是看不到。执行unsetopt multios后能看到nomultios选项,但这也没帮上忙。
我知道类似的问题有人问过也有人答过,但那些答案基本都在我上面试的列表里,对我都不管用。
另外提一句,我还设置了一个用文件描述符3的调试日志,专门用来输出调试内容(用>&3结尾的行),应该和这个问题无关,但还是说一下。
补充有效解决方案(后续发现)
后来发现之前的测试是因为shebang写错了,修正后结果有变化。除了Gairfowl提供的方案,这个写法也能正常工作:
exec > >(tee $LOG) 2>&1
备注:内容来源于stack exchange,提问作者Jim Worrall
相关产品推荐
相关产品推荐

