![将脚本输出的副本发送到文件](https://linux22.com/image/37640/%E5%B0%86%E8%84%9A%E6%9C%AC%E8%BE%93%E5%87%BA%E7%9A%84%E5%89%AF%E6%9C%AC%E5%8F%91%E9%80%81%E5%88%B0%E6%96%87%E4%BB%B6.png)
假设我有一个 Zsh 脚本,我想让它打印输出到STDOUT
,但也将其输出复制(转储)到磁盘中的文件。
此外,该脚本以以下选项开头
set -o xtrace
这迫使它变得冗长并打印它运行的命令。我想在磁盘中的文件中捕获此输出。
我的理解是如果我这样做
./my_script.sh > log.txt
它只会发送STDOUT
到log.txt
,但是如果我还想能够在终端中看到输出怎么办?
我读过关于tee
和MULTIOS
Zsh 中的选项,但我不确定如何使用它们。
当我做:
./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
),然后通过管道传输stdout
到tee
,将其复制到终端和到日志文件。
多zsh
操作系统等效项是:
./myscript.sh >&1 > log.txt 2>&1
也就是说,将 stdout 重定向到原始 stdout 和 log.txt (内部通过管道到类似 的东西tee
),然后将 stderr 也重定向到那个(到tee
类似内部进程的管道)。
答案2
即使控制台死机或关闭,nohup 也允许作业继续进行,这对于长时间备份等很有用,但在这里我们使用它的自动日志记录。
nohup myscript.sh & ; tail -f nohup.out