2010-10-27 84 views
4

我想要一個腳本,其中所有命令都是tee'd到日誌文件。強制`tee`運行在shell腳本中的每個命令?

現在我在正是如此腳本運行的每一個命令:

<command> | tee -a $LOGFILE 

有沒有辦法在一個shell腳本來管tee迫使每一個命令?

運行腳本時,並希望確保它記錄甚至適當如果主叫用戶不添加自己的日誌調用我不能強迫用戶添加適當的tee ING。

回答

15

你可以做你的腳本里面的包裝:

#!/bin/bash 
{ 
echo 'hello' 
some_more_commands 
echo 'goodbye' 
} | tee -a /path/to/logfile 

編輯:

這裏的另一種方式:

#!/bin/bash 
exec > >(tee -a /path/to/logfile) 
echo 'hello' 
some_more_commands 
echo 'goodbye' 
+0

我喜歡這個 - 沒有想過使用括號 – warren 2010-10-27 20:22:20

+1

@warren:看看我的編輯另一種方法。 – 2010-10-27 20:33:58

2

爲什麼不暴露包裝,簡直是:

/path/to/yourOriginalScript.sh | tee -a $LOGFILE 

你的用戶不應該執行(甚至也不知道)yourOriginalScript.sh

1

一些方法是創建所有用戶調用自己的腳本的runner腳本「run_it」。

run_it my_script 

所有的魔法都會在可能看起來像:

LOG_DIR=/var/log/ 
[email protected] | tee -a $LOG_DIR/ 
2

假設你腳本不採取--tee的說法,你可以做到這一點(如果你不要用這樣的說法,只是你不使用參數)替換--tee如下:

#!/bin/bash 

if [ -z "$1" ] || [ "$1" != --tee ]; then 
    $0 --tee "[email protected]" | tee $LOGFILE 
    exit $? 
else 
    shift 
fi 
# rest of script follows 

這只是已腳本重新運行本身,使用特殊參數--tee防止無限遞歸,其輸出作爲管道進入tee

+0

也可以使用'exec'來不分叉額外的進程:'if ...;然後exec $ 0 - 被賦予「$ @」;其他;轉移; (退出將不再需要)... – FooF 2016-09-07 08:36:14

相關問題