escapar de comillas dobles y signos de porcentaje (%) en cron

75

El siguiente comando funciona desde prompt pero no desde crontab.

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

Necesito agregarlo al cron diario.

shantanuo
fuente
Su ejemplo es sorprendente, el% está rodeado de comillas dobles, simples y anteriores. Sin dejar ninguna esperanza de que escapar de la cita podría funcionar.
tuxayo

Respuestas:

126

Tienes que escapar de las %señales. Tienen un significado especial en 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
fuente
77
+1 Muy interesante, yo tampoco lo sabía. Sorprendido, no me he encontrado con esto.
Kyle Smith
3
Bueno, acabo de encontrarme con esto. Estaba usando date +%Fy no estaba llegando a ninguna parte
adamo
2
¿Esta sintaxis tiene algún uso útil? Con SHELL=/bin/bash, siempre puedo reescribir cat %Hello worldcomo cat <<<'Hello world'. No veo la necesidad de una sintaxis especial.
Witiko
@Witiko Si la "sintaxis especial" que está preguntando es la barra invertida para escapar del porcentaje, entonces la propia pregunta del OP es un ejemplo donde se necesita: argumentos de comando que requieren un porcentaje, especialmente el programa de fecha, que sería bastante popular en un comando crontab. Si realmente está preguntando por qué cron tiene este problema en primer lugar: es decir: sustituye el salto de línea en lugar del porcentaje, entonces supongo que es para que pueda suministrar, en una sola línea que requiere crontab, un "comando" que consta de dos o más comandos subsidiarios.
gwideman
El último. Y, como mencioné, uno puede hacer lo mismo con bash. No es necesario ensuciar la sintaxis de Cron.
Witiko
7

Esto no responde directamente a su pregunta, pero sugeriría que cree un archivo de script en / usr / local / bin (o ~ / bin o lo que sea apropiado) y que lo llame desde cron. Es más fácil de probar y editar.

Randy Orrison
fuente
2
En mi experiencia, es mucho más fácil mantener 50 líneas en un crontab que mantener 50 archivos pequeños. Seguramente querrá convertir los scripts más largos en archivos de script, pero hacerlo para una sola línea puede ser una exageración.
Witiko