Tengo los siguientes trabajos cron definidos.
55 8 * * 3 /usr/bin/php /home/mark/dev/processes/customClient/events.php > /home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv
0 9 * * 3 /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s 'Events from `date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`' -a '/home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv'
Parece funcionar correctamente si ejecuto el comando anterior directamente desde la línea de comando. Pero cuando revisé la ejecución del script esta mañana, recibí un correo electrónico que decía (estoy parafraseando porque los eliminé accidentalmente) que los ticks posteriores no se cerraron correctamente.
command-line
cron
Mark D
fuente
fuente
/bin/sh: 1: Syntax error: EOF in backquote substitution
Para el primer trabajo cron./bin/sh: 1: Syntax error: Unterminated quoted string
Para el segundo trabajo cron.$(...)
le ayudará a lidiar con los problemas de cotización ...Respuestas:
Recomiendo encarecidamente colocar cualquier trabajo cron no trivial en su propio archivo de script de shell, por muchas razones:
fuente
%
caracteres problemáticos en el guión evitará que loscron
conviertan en nuevas líneas, que es su verdadero problema.Hay tres causas comunes para que los comandos de trabajo cron se comporten de manera diferente en comparación con los comandos escritos directamente en un shell interactivo, en un orden aproximado de comunidad:
$PATH
y faltan otras variables esperadas./bin/sh
de forma predeterminada, mientras que puede estar utilizando algún otro shell de forma interactiva.%
personaje especialmente (se convierte en una nueva línea en el comando).Debe preceder a todos los
%
caracteres con a\
en un archivo crontab, que le dice a cron que solo ponga un porcentaje en el comando. Recuerde eso cuando use eldate
comando en un trabajo cron.También arreglé algunos problemas de citas:
$(…)
en su lugar: sus reglas de análisis son más simples."$somevariable"
,"$(somecommand)"
. Aquí la falta de comillas fue inofensiva porque eldate
comando nunca devolvió ningún carácter especial para los formatos que usó, pero debe recordar cuidadosamente qué caracteres son especiales y verificar esto cada vez que deje una sustitución sin comillas. Que sea simple, siempre use comillas dobles a menos que desee que se produzca la división de campos y la generación de nombre de archivo en el resultado.fuente
Parece que has anidado
'
en elmutt
comando:Intente usar en
"
lugar del interno'
para que la instrucción leafuente