Bash

準備用於輸出到文件和控制台的 shell 腳本

  • March 18, 2022

我知道可以使用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

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