svn | awk | 邮件在bash中工作,但不在cron工作中

jdo*_*dog 2 svn shell cron awk quoting

我有以下命令来显示对subversion存储库的更改

svn log -v -r{$(date +%Y-%m-%d)}:HEAD http://therepository | awk '/^r[0-9]+ / {user=$3} {if (user=="username") {print $1 $2 $3}}' | mail -ne -s'Users SVN commits' email@email.com
Run Code Online (Sandbox Code Playgroud)

它在命令行中工作正常.

当我将其粘贴到crontab中时,我收到以下错误消息:

/bin/sh: -c: line 0: unexpected EOF while looking for matching `)'
/bin/sh: -c: line 1: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

如何引用它?

Boh*_*ian 6

使用cron时,通过将所有内容放入shell脚本,然后从cron调用shell脚本来避免此类问题的麻烦.

这种方法是常用的,也是一个好主意,因为:

  • 它使您的命令易于测试(您不必做愚蠢的事情,例如在一分钟的时间内安排执行)
  • 如果必须,可以轻松手动调用,例如,如果作业失败,操作可以在不触及crontab的情况下重新运行 - 也可以从其他作业调用作业,例如,检查所有作业是否运行正常的最终作业并重新运行没有
  • 它将执行的内容与执行时的内容分开- 将cron留给(仅)执行最佳操作:调度
  • 它使您可以完全访问shell脚本功能,或使用不同的shell(如perl)
  • 它使crontab保持干净,易于阅读
  • 任何开发/维护cron任务的人都知道如果你为cron任务使用一致的目录(例如/ opt/cron或其他),在哪里查看
  • 您可以将您的cron任务置于源代码控制之下 - 通常会忽略shell脚本以进行源代码控制,但它们是代码,因此可以从源代码控制中受益

例如:

dosomething.sh:

svn log -v -r{$(date +%Y-%m-%d)}:HEAD http://therepository | awk '/^r[0-9]+ / {user=$3} {if (user=="username") {print $1 $2 $3}}' | mail -ne -s'Users SVN commits' email@email.com
Run Code Online (Sandbox Code Playgroud)

cron 0 22 * * * /opt/cron/dosomething.sh
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,好的一点.我找到答案的同时,%必须用\ (2认同)