这是我想自动化的:
00 08 * * * psql -Uuser database < query.sql | mail [email protected] -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
从crontab(5) :
“第六”字段(行的其余部分)指定要运行的命令。 行的整个命令部分,直到换行符或%字符,将由/ bin / sh或由crontab文件的SHELLvariables中指定的shell来执行。 命令中的百分号(%),除非用反斜线()转义,否则将被改为换行符,并且第一个%之后的所有数据将作为标准input发送到该命令。 没有办法将单个命令行分割成多行,如shell的尾部“\”。
只需在%符号前添加反斜杠即可:
00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"
反引起了很多问题。 有时你需要多于一次的引号和反引号。 只需将它们replace为$()。
例:
export NOW=`date` by export NOW=$(date)
-Gilson Soares
要解决该问题,请跳过您的%字符 。 date +%Y-%m-%d
应该是date +\%Y-\%m-\%d
不幸的是,这个答案有点晚了,但问题不是PATH或反引号问题 – 只是百分号字符'%'是用来表示NEWLINE或crontab条目中的STDIN的特殊字符 。
这与date
命令的格式化input冲突。 这样的命令包括: date +%Y-%m-%d
将被解释为:
date Y- m- d
这与棒棒无关。 可怕的是,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文件,并且这个文件被调用。