以下是我想要自动化的内容:
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
答案1
“第六个”字段(行的其余部分)指定要运行的命令。行的整个命令部分(直到换行符或 % 字符)将由 /bin/sh 或 crontab 文件的 SHELL 变量中指定的 shell 执行。除非使用反斜杠 () 进行转义,否则命令中的百分号 (%) 将更改为换行符,并且第一个 % 之后的所有数据将作为标准输入发送到命令。没有办法将单个命令行拆分为多行,就像 shell 的尾随“\”一样。
只需在 % 符号前添加反斜杠:
00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"
答案2
解决问题转义 % 字符。date +%Y-%m-%d
应该date +\%Y-\%m-\%d
不幸的是,这个答案有点晚了,但问题不是 PATH 或反引号 - 问题只是百分比字符 '%' 是用于表示 crontab 条目中的 NEWLINE 或 STDIN 的特殊字符。
这与命令的格式输入相冲突date
。因此,包含以下内容的命令date +%Y-%m-%d
将被解释为:
date Y- m- d
答案3
我也遇到了很多与反引号有关的问题。有时你需要多次出现引号和反引号。只需将它们替换为 $() 即可。
例子:
export NOW=`date`
by
export NOW=$(date)
-吉尔森·索亚雷斯
答案4
这与 backsticks 无关。糟糕的是 cron 看不到 PATH,而您必须在 cron 脚本中反复告诉 cron“PATH 是什么?”。
PATH=/bin:/usr/bin:/usr/sbin
* * * * * /your/script/here
我赞成将命令写在文件中,而不是在 cron 行中逐字传递命令。更优雅的做法是
* * * * * /your/script/here
比
* * * * * perl -e '$@#$@$%%@' | grep -e '@#$@$#$@' | sed s/asfdf/asdfa/
这些行可以进入一个文件,chmod +x 文件,然后调用这个文件。