Bash
準備用於輸出到文件和控制台的 shell 腳本
我知道可以使用
tee
將輸出的內容複製到文件並仍將其輸出到控制台。但是,我似乎找不到一種方法來準備 shell 腳本(如固定模板),而不使用
tee
腳本中的每個命令或使用管道執行腳本到tee
.因此,我必須每次都使用管道開始呼叫腳本,
tee
而不是通過腳本自動為我執行此操作。我嘗試使用管道使用修改後的 shebang,但沒有成功,我似乎找不到實現此目的的方法。
所以不要像這樣呼叫腳本:
./myscript.sh |& tee scriptout.txt
我想通過這樣呼叫它來獲得相同的效果:
./myscript
當然,腳本需要知道腳本內部變數中設置的文件名。
我怎樣才能做到這一點?
您可以將腳本的內容包裝在一個函式中,並將函式輸出通過管道傳輸到
tee
:#!/bin/bash { echo "example script" } | tee -a /logfile.txt
您可能可以做一些事情,比如在腳本開始時使用
exec
. (我沒有對此進行過強烈的測試。)#!/bin/bash # Split script output to stdout and to the logfile exec 1> >(tee -a "/tmp/${0##*/}.log") # Write a message echo hello, world # Empirical pause before exiting to wait for all output to get through the tee sleep 1 exit 0
範例,假設腳本被呼叫
demo
並已通過以下方式執行chmod a+x demo
:ls -l /tmp/demo.log ls: cannot access '/tmp/demo.log': No such file or directory ./demo hello, world cat /tmp/demo.log hello, world