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

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

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

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

set -o xtrace

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

我的理解是如果我这样做

./my_script.sh > log.txt

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

我读过关于teeMULTIOSZsh 中的选项,但我不确定如何使用它们。

当我做:

./my_script | tee log.txt

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

答案1

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

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

./my_script.sh > log.txt 2>&1会做相反的事情,将所有内容转储到日志文件中,但在屏幕上不显示任何内容。

诀窍是将两者结合起来tee

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

stderr这将( 2)重定向到stdout( 1),然后通过管道传输stdouttee,将其复制到终端到日志文件。

zsh操作系统等效项是:

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

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

答案2

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

nohup myscript.sh & ; tail -f nohup.out

相关内容