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)
它只会发送STDOUT
到log.txt
,但是如果我还想在终端中看到输出怎么办?
我已经阅读了Zsh 中的tee
和MULTIOS
选项,但不确定如何使用它们。
当我做:
./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
,将其复制到终端和日志文件。
该zsh
multios相当于将是:
./myscript.sh >&1 > log.txt 2>&1
Run Code Online (Sandbox Code Playgroud)
也就是说,将 stdout 重定向到原始 stdout 和 log.txt(在内部通过管道到类似 的东西tee
),然后将 stderr 也重定向到那个(到管道到类似内部tee
的进程)。