échappant aux guillemets doubles et aux signes de pourcentage (%) dans cron

75

La commande suivante fonctionne à partir de prompt mais pas de crontab.

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

J'ai besoin de l'ajouter à cron quotidien.

shantanuo
la source
Votre exemple est incroyable, le% est entouré de guillemets doubles, simples et arrières. Ne laissant aucun espoir que l'évasion d'une citation puisse fonctionner.
Tuxayo

Réponses:

126

Vous devez échapper aux %signes. Ils ont une signification particulière dans les 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.
bmk
la source
7
+1 Très intéressant, je ne le savais pas non plus. Surpris je n'ai pas couru dans ceci.
Kyle Smith
3
Eh bien, je viens de courir dans cela. J'utilisais date +%Fet je
n'allais
2
Cette syntaxe a-t-elle une utilité utile? Avec SHELL=/bin/bash, je peux toujours réécrire en cat %Hello worldtant que cat <<<'Hello world'. Je ne vois pas la nécessité d'une syntaxe spéciale.
Witiko
@Witiko Si la "syntaxe spéciale" dont vous parlez est la barre oblique inversée pour échapper un pourcentage, la question du PO est un exemple où il est nécessaire: des arguments de commande nécessitant un pourcentage, notamment le programme de date, qui serait assez populaire dans commande crontab. Si vous demandez en fait pourquoi cron a eu ce truc en premier lieu: c'est-à-dire: substitue un saut de ligne au lieu de cent, alors je suppose que c'est pour vous permettre de fournir, sur une seule ligne requise par crontab, une "commande" composée de deux ou plusieurs commandes subsidiaires.
Gwideman
Le dernier. Et, comme je l’ai dit, on peut faire la même chose avec bash. Pas besoin de lire la syntaxe de Cron.
Witiko
7

Cela ne répond pas directement à votre question, mais je vous suggérerais de créer un fichier de script dans / usr / local / bin (ou ~ / bin ou ce qui est approprié) et de l'appeler à partir de cron. C'est plus facile à tester et à éditer.

Randy Orrison
la source
2
D'après mon expérience, il est beaucoup plus facile de gérer 50 lignes dans une crontab que de gérer 50 fichiers minuscules. Vous voudrez certainement transformer des scripts plus longs en fichiers de script, mais cela peut s'avérer excessif pour une seule ligne.
Witiko