[英]Force `tee` to run for every command in a shell script?
我想有一个脚本,其中所有的命令都是tee
“d到一个日志文件。
现在我正在运行脚本中的每个命令:
<command> | tee -a $LOGFILE
有没有办法强制shell脚本中的每个命令管道到tee
?
我无法强制用户在运行脚本时添加适当的tee
,并且希望确保即使主叫用户没有添加他们自己的日志记录调用也能正确记录。
您可以在脚本中执行包装:
#!/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
。
假设你的脚本没有接受--tee
参数,你可以这样做(如果你确实使用了那个参数,只需用下面用你不使用的参数替换--tee
):
#!/bin/bash
if [ -z "$1" ] || [ "$1" != --tee ]; then
$0 --tee "$@" | tee $LOGFILE
exit $?
else
shift
fi
# rest of script follows
这只是让脚本重新运行,使用特殊参数--tee
来防止无限递归,将其输出管道输入到tee
。
一些方法是创建所有用户调用他们自己的脚本的跑步者脚本“run_it”。
run_it my_script
所有的魔法都将在内部完成,例如可能看起来像:
LOG_DIR=/var/log/
$@ | tee -a $LOG_DIR/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.