在cron中转义双引号和百分号(%)


75

以下命令在提示符下起作用,但在crontab中不起作用。

 grep abc  /var/log/messages | grep "`date '+%B %d'`" | mail -s"abc log of `hostname`" shantanu.oak+`hostname`@gmail.com

我需要将其添加到每日cron。


您的示例非常了不起,%用双引号,简单引号和反引号引起来。绝不希望引号转义可以奏效。
tuxayo

Answers:


125

您必须逃避%迹象。它们在crontabs中具有特殊含义:

man (5) crontab:

Percent-signs (%) in the command, unless escaped with backslash (\), 
will be changed into newline characters, and all data after the 
first % will be sent to the command as standard input.

7
+1非常有趣,我也不知道。感到惊讶的是我还没有遇到这个问题。
凯尔·史密斯

3
好吧,我确实碰到了这一点。我一直在使用date +%F,却
一无所获

2
这个语法有什么用吗?有了SHELL=/bin/bash,我总是可以改写cat %Hello worldcat <<<'Hello world'。我认为不需要特殊语法。
Witiko '17

@Witiko如果您要问的“特殊语法”是反斜杠以转义百分号,则OP自身的问题就是需要它的一个示例:需要百分号的命令参数,尤其是日期程序,这在A中非常流行。 crontab命令。如果您实际上是在问为什么cron首先要解决此难题:即:用换行代替%,那么我想您可以在crontab要求的单行中提供由以下两个组成的“命令”或更多辅助命令。
gwideman '18

后者。而且,正如我提到的,使用bash可以做到这一点。无需乱写Cron的语法。
Witiko

7

这不能直接回答您的问题,但是我建议您在/ usr / local / bin(或〜/ bin或任何合适的文件)中创建一个脚本文件,然后从cron调用它。测试和编辑更加容易。


2
以我的经验,在crontab中维护50行比维护50个小文件要容易得多。您肯定会想要将更长的脚本转换为脚本文件,但是对于单行脚本这样做可能会过大。
Witiko
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.