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

时间:2011-08-14 20:59:51

标签: 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

它在命令行中运行良好。

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

/bin/sh: -c: line 0: unexpected EOF while looking for matching `)'
/bin/sh: -c: line 1: syntax error: unexpected end of file

如何引用它?

2 个答案:

答案 0 :(得分: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

cron 0 22 * * * /opt/cron/dosomething.sh

答案 1 :(得分:1)

最简单的方法是将其保存为bash脚本,然后从cron运行脚本。

(我本来是这个评论而不是答案,但是我不会让我发表评论)