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

Ame*_*ina 12 zsh pipe io-redirection shell-script output

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

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

set -o xtrace
Run Code Online (Sandbox Code Playgroud)

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

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

./my_script.sh > log.txt
Run Code Online (Sandbox Code Playgroud)

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

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

当我做:

./my_script | tee log.txt
Run Code Online (Sandbox Code Playgroud)

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

sav*_*nto 17

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

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

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

诀窍是将两者结合起来tee

./myscript.sh 2>&1 | tee log.txt
Run Code Online (Sandbox Code Playgroud)

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

zshmultios相当于将是:

./myscript.sh >&1 > log.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

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