我的cronjob语法有什么问题,我正在尝试使用反引号(`)?


31

这是我想要自动化的:

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +%Y-%m-%dZ%I:%M`"

这是错误消息:

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

2
除了给出错误之外,请考虑将其放在schell脚本中。它会假装crontab笨拙,您可以在脚本文件中添加注释和配置。
PeterMmm

Answers:


67

crontab(5)

``第六''字段(行的其余部分)指定要运行的命令。该行的整个命令部分(最多换行符或%字符)将由/ bin / sh或crontab文件的SHELL变量中指定的shell执行。除非使用反斜杠()进行转义,否则命令中的百分号(%)将更改为换行符,并且第一个%之后的所有数据将作为标准输入发送至命令。无法将单个命令行拆分为多行,例如shell的尾随“ \”。

只需在%符号前添加反斜杠即可:

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"

8

要解决此问题,请转义您的%个字符date +%Y-%m-%d应该date +\%Y-\%m-\%d

不幸的是,这个答案有点晚了,但问题不是PATH或反引号-问题仅仅是百分号'%'是用于在crontab条目中表示NEWLINE或STDIN的特殊字符

这与date命令的格式输入冲突。因此,包含以下内容的命令date +%Y-%m-%d将被解释为:

date Y- m- d


4

我也有很多反引号的问题。有时您需要多个引号和反引号。只需将它们替换为$()。

例:

export NOW=`date`
by
export NOW=$(date)

-吉尔森·苏亚雷斯


1
+1无论如何,这是当今最受欢迎的语法。
丹·卡利

4
但这与用户的问题无关。
亚伦·布朗

1
当然,它还有关于后盾的信息,请再次阅读该问题。
塞尔吉奥·阿布雷乌

谢谢,花了我一段时间才意识到反引号打破了我的笨拙-我现在也开始在所有脚本中使用$()
Eric Kigathi

-2

它与底杆无关。一个可怕的事情是cron看不到PATH,而您必须告诉cron“ PATH是什么?” 在cron脚本中一遍又一遍。

PATH=/bin:/usr/bin:/usr/sbin
* * * * * /your/script/here

而且我赞成将命令写入文件中,而不是直接在cron行中传递命令。拥有它要优雅得多

* * * * * /your/script/here

* * * * * perl -e '$@#$@$%%@' | grep -e '@#$@$#$@' | sed s/asfdf/asdfa/

这些行可以放在一个文件内,即chmod + x文件和要调用的该文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.