将脚本输出的副本发送到文件


10

假设我有一个Zsh脚本,我想让它将输出打印到STDOUT,而且还要将其输出复制(转储)到磁盘上的文件中。

此外,脚本以以下选项开头

set -o xtrace

这迫使它变得冗长,并打印它运行的命令。我也想在磁盘上的文件中捕获此输出。

我的理解是,如果我这样做

./my_script.sh > log.txt

它只会发送STDOUTlog.txt,但是如果我也希望能够在终端中看到输出怎么办?

我已经阅读了Zsh中的teeMULTIOS选项,但是不确定如何使用它们。

当我做:

./my_script | tee log.txt

我可以在终端上看到输出,但是该文件log.txt似乎无法捕获所有内容(实际上它几乎捕获不到任何内容)。


./my_script.sh > log.txt 2>&1
mikeserv 2014年

看起来您在寻找script命令。或者,也许myscript >&1 > log.txt 2>&1
斯特凡Chazelas

Answers:


12

可能是您的脚本正在向stdout和生成输出stderr,而您只能将其中的流之一输出到日志文件中。

./my_script.sh | tee log.txt确实会将所有内容输出到终端,但只会转储stdout到日志文件中。

./my_script.sh > log.txt 2>&1 将执行相反的操作,将所有内容都转储到日志文件,但在屏幕上不显示任何内容。

诀窍是将两者与tee

./myscript.sh 2>&1 | tee log.txt

这会将stderr2)重定向到stdout1),然后通过管道stdout导入tee,将其复制到终端日志文件中。

zsh操作系统等效为:

./myscript.sh >&1 > log.txt 2>&1

也就是说,将stdout都重定向到原始stdout和log.txt(内部通过管道tee重定向到类似的东西),然后也将stderr重定向到该终端(重定向到内部tee类进程的管道)。


谢谢-关于最后一行,为什么不./myscript.sh >&1 2>&1 > log.txt呢?(即,切换最后两个重定向的顺序)。它们之间会有区别吗?
Amelio Vazquez-Reina 2014年

您的变体不会输出到stdout,而只会输出到log.txt。答案的最后一行(由@StéphaneChazelas添加,而不是我自己添加)同时输出到两者。
savanto 2014年

0

即使控制台死机或关闭,nohup允许作业继续进行,这对于冗长的备份等很有用,但是这里我们使用的是自动日志记录。

nohup myscript.sh & ; tail -f nohup.out
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.