Shell-Script
將腳本輸出的副本發送到文件
假設我有一個 Zsh 腳本,我想讓它列印輸出到
STDOUT
,但也將其輸出複制(轉儲)到磁碟中的文件。此外,腳本以以下選項開頭
set -o xtrace
這迫使它變得冗長並列印它執行的命令。我也想在磁碟中的文件中擷取此輸出。
我的理解是,如果我這樣做
./my_script.sh > log.txt
它只會發送
STDOUT
到log.txt
,但是如果我還想在終端中看到輸出怎麼辦?我已經閱讀了Zsh 中
tee
的選項和MULTIOS
選項,但不知道如何使用它們。當我做:
./my_script | tee log.txt
我可以在終端上看到輸出,但該文件
log.txt
似乎沒有擷取所有內容(實際上它幾乎沒有擷取任何內容)。
可能是您的腳本正在生成到
stdout
and的輸出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
其複製到終端和日誌文件。multios
zsh
等價物是:./myscript.sh >&1 > log.txt 2>&1
也就是說,將 stdout 重定向到原始的 stdout 和 log.txt (通過管道在內部工作到類似的東西
tee
),然後將 stderr 也重定向到那個(到管道到類似內部tee
的程序)。