我想要一个脚本,其中所有命令都是tee
到日志文件。
现在我正在运行脚本中的每个命令:
<command> | tee -a $LOGFILE
有没有办法强制shell脚本中的每个命令都可以管道到tee
?
我无法强制用户在运行 脚本 时添加适当的tee
,并且希望确保即使主叫用户没有正确记录添加自己的日志记录调用。
答案 0 :(得分: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'
答案 1 :(得分:2)
为什么不公开一个简单的包装器:
/path/to/yourOriginalScript.sh | tee -a $LOGFILE
您的用户不应执行(甚至不知道)yourOriginalScript.sh
。
答案 2 :(得分:2)
假设你的脚本没有采用--tee
参数,你可以这样做(如果你确实使用了那个参数,只需用你不使用的参数替换下面的--tee
):< / p>
#!/bin/bash
if [ -z "$1" ] || [ "$1" != --tee ]; then
$0 --tee "$@" | tee $LOGFILE
exit $?
else
shift
fi
# rest of script follows
这只是让脚本重新运行,使用特殊参数--tee
来阻止无限递归,将其输出汇总到tee
。
答案 3 :(得分:1)
一些方法是创建跑步者脚本“run_it”,所有用户都可以调用他们自己的脚本。
run_it my_script
所有魔法都将在内部完成,例如:可能看起来像那样:
LOG_DIR=/var/log/
$@ | tee -a $LOG_DIR/