2010-10-27 88 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

相关问题