我正在编写一组 bash 脚本。
第一个wrapper
调用两个脚本:do_something
和do_something_else
。
在伪代码中:
$ wrapper
do_something
if exitcode of do_something = 0 then
do_something_else
else
exit with error
fi
exit success
这将生成一个日志文件:
$ cat /var/logs/wrapper.log | tail -3
Deleting file 299
Deleting file 300
wrapper ran successfully on 01/01/18 00:01:00 GMT
我有两个目标:
- 创建整个过程的日志。换句话说,我想要将
do_something
,do_something_else
发送wrapper
到 stdout 和 stderr 的所有内容都放在一个日志文件中,该日志文件显示该脚本的日常运行,以便我可以 grep 查找错误。 - 我想预编译
do_something
,do_something_else
这样wrapper
我就可以将它们放入/usr/bin
我scp
的所有系统中。这样我就可以在开发中拥有一个源代码,并在产品中快速运行不可编辑的代码。
这可能吗?
答案1
以下是如何在一个脚本中处理这种情况的示例,同时又不会丢失 OP 所需的功能,即:
能够同时运行多个逻辑块,或者一次运行一个逻辑块。
能够将这些操作记录到文件中。
这是一个简单的例子。如果您像对待任何其他语言一样对待脚本语言,并编写有组织的代码,那么突然间您就可以用它做各种事情了。诀窍是不要在函数之外留下松散的逻辑块,这样你就可以轻松地切换内容,使用一个而不是另一个,调试部分,添加一个日志记录功能,这就是我通常所做的,error_handler( ), 等等。几乎不需要额外的工作,也就是说,您最终会得到一个简单但干净且易于维护的应用程序,而不是一堆相互堆叠的随机操作行。
文件:我的东西
#!/usr/bin/env bash
logfile='logfile.log'
function main() {
case "$1" in
run-all)
block_1
block_2
;;
run-1)
block_1
;;
run-2)
block_2
;;
*)
echo 'No start option provided. Exiting'
exit 1
;;
esac
}
function block_1(){
do_something
if [ "$?" == 0 ]; then
do_something_else
echo "Deleting file 299" >> $logfile
echo "Deleting file 300" >> $logfile
echo "wrapper ran successfully on 01/01/18 00:01:00 GMT" >> $logfile
else
exit "$?"
fi
}
function block_2(){
do_something
if [ "$?" == 0 ]; then
do_something_else
echo "Deleting file 299" >> $logfile
echo "Deleting file 300" >> $logfile
echo "wrapper ran successfully on 01/01/18 00:01:00 GMT" >> $logfile
else
exit "$?"
fi
}
# $@ is the list of start arguments, which main will use
# with $1, $2, and so on.
main $@
你可以这样运行:
./my_stuff 'run-all'
这当然只是一个示例,但实际上您所做的就是组织逻辑,按照使用任何语言的方式进行排列,然后触发所需的操作。我发现,如果我开始 shell 脚本时假设它们将被使用和维护,并且如果我使用函数编写它们,那么它们就像我所做的任何其他编程一样灵活且易于维护。
答案2
关于日志文件部分的所有内容:用于exec
重定向stdout和stderr,这里date
用于将日期放在日志文件名上:
#!/bin/bash
exec > /somedir/somelog.$(date +%F)
exec 2>&1
# output goes to the log file even if this is an external command
somecmd...