我想要一个脚本,其中所有命令都是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