Shell-Script

將腳本輸出的副本發送到文件

  • December 6, 2016

假設我有一個 Zsh 腳本,我想讓它列印輸出到STDOUT,但也將其輸出複制(轉儲)到磁碟中的文件。

此外,腳本以以下選項開頭

set -o xtrace

這迫使它變得冗長並列印它執行的命令。我也想在磁碟中的文件中擷取此輸出。

我的理解是,如果我這樣做

./my_script.sh > log.txt

它只會發送STDOUTlog.txt,但是如果我還想在終端中看到輸出怎麼辦?

我已經閱讀了Zsh 中tee的選項和MULTIOS選項,但不知道如何使用它們。

當我做:

./my_script | tee log.txt

我可以在終端上看到輸出,但該文件log.txt似乎沒有擷取所有內容(實際上它幾乎沒有擷取任何內容)。

可能是您的腳本正在生成到stdoutand的輸出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其複製到終端日誌文件。

multioszsh等價物是:

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

也就是說,將 stdout 重定向到原始的 stdout 和 log.txt (通過管道在內部工作到類似的東西tee),然後將 stderr 也重定向到那個(到管道到類似內部tee的程序)。

引用自:https://unix.stackexchange.com/questions/134734