我想要一個腳本,其中所有命令都是tee
'd到日誌文件。強制`tee`運行在shell腳本中的每個命令?
現在我在正是如此腳本運行的每一個命令:
<command> | tee -a $LOGFILE
有沒有辦法在一個shell腳本來管tee
迫使每一個命令?
運行腳本時,並希望確保它記錄甚至適當如果主叫用戶不添加自己的日誌調用我不能強迫用戶添加適當的tee
ING。
我想要一個腳本,其中所有命令都是tee
'd到日誌文件。強制`tee`運行在shell腳本中的每個命令?
現在我在正是如此腳本運行的每一個命令:
<command> | tee -a $LOGFILE
有沒有辦法在一個shell腳本來管tee
迫使每一個命令?
運行腳本時,並希望確保它記錄甚至適當如果主叫用戶不添加自己的日誌調用我不能強迫用戶添加適當的tee
ING。
你可以做你的腳本里面的包裝:
#!/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'
爲什麼不暴露包裝,簡直是:
/path/to/yourOriginalScript.sh | tee -a $LOGFILE
你的用戶不應該執行(甚至也不知道)yourOriginalScript.sh
。
一些方法是創建所有用戶調用自己的腳本的runner腳本「run_it」。
run_it my_script
所有的魔法都會在可能看起來像:
LOG_DIR=/var/log/
[email protected] | tee -a $LOG_DIR/
假設你腳本不採取--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
。
也可以使用'exec'來不分叉額外的進程:'if ...;然後exec $ 0 - 被賦予「$ @」;其他;轉移; (退出將不再需要)... – FooF 2016-09-07 08:36:14
我喜歡這個 - 沒有想過使用括號 – warren 2010-10-27 20:22:20
@warren:看看我的編輯另一種方法。 – 2010-10-27 20:33:58