Quel est le problème avec ma syntaxe cronjob, j'essaie d'utiliser un backtick (`)?

31

Voici ce que j'aimerais automatiser:

00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for `date +%Y-%m-%dZ%I:%M`"

Voici le message d'erreur:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file
Terry G Lorber
la source
2
En dehors de l'erreur de donner, pensez à mettre cela dans un script schell. Il prétendra que la crontab est maladroite et vous pouvez ajouter des commentaires et une configuration à votre fichier de script.
PeterMmm

Réponses:

67

Depuis crontab (5) :

Le champ `` sixième '' (le reste de la ligne) spécifie la commande à exécuter. La portion de commande entière de la ligne, jusqu'à une nouvelle ligne ou un caractère%, sera exécutée par / bin / sh ou par le shell spécifié dans la variable SHELL du fichier crontab. Les signes de pourcentage (%) dans la commande, sauf s'ils sont échappés avec une barre oblique inverse (), seront modifiés en caractères de nouvelle ligne, et toutes les données après le premier% seront envoyées à la commande comme entrée standard. Il n'y a aucun moyen de diviser une seule ligne de commande en plusieurs lignes, comme le "\" final du shell.

Ajoutez simplement des barres obliques inverses avant les signes%:

00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"
Juliano
la source
8

Pour résoudre le problème, échappez à vos% caractères . date +%Y-%m-%ddevrait êtredate +\%Y-\%m-\%d

Malheureusement, cette réponse est un peu tardive, mais le problème n'est pas PATH ou des astuces - le problème est simplement que le caractère de pourcentage '%' est un caractère spécial utilisé pour désigner un NEWLINE ou un STDIN dans les entrées crontab .

Cela entre en conflit avec l'entrée de mise en forme de la datecommande. En tant que telle, une commande qui comprend: date +%Y-%m-%dsera interprétée comme:

date Y- m- d

Eric Kigathi
la source
4

J'ai aussi eu beaucoup de problèmes avec les backticks. Parfois, vous avez besoin de plusieurs occurrences de guillemets et de guillemets. Remplacez-les simplement par $ ().

Exemple:

export NOW=`date`
by
export NOW=$(date)

-Gilson Soares

Guilsson
la source
1
+1 C'est de toute façon la syntaxe préférée de nos jours.
Dan Carley
4
mais cela n'a rien à voir avec la question de l'utilisateur.
Aaron Brown
1
bien sûr, il a, à propos de baguettes, relisez la question.
Sergio Abreu
Merci, il m'a fallu un certain temps pour réaliser que les backticks brisaient mes crons - j'ai aussi commencé à utiliser $ () dans tous mes scripts
Eric Kigathi
-2

Cela n'a rien à voir avec les backsticks. Une chose terrible est que cron NE voit PAS le CHEMIN, et vous DEVEZ dire à cron "qu'est-ce que le CHEMIN?" encore et encore dans les scripts cron.

PATH=/bin:/usr/bin:/usr/sbin
* * * * * /your/script/here

Et je suis favorable à l'écriture de la commande dans un fichier au lieu de passer la commande littéralement dans la ligne cron. C'est beaucoup plus élégant d'avoir

* * * * * /your/script/here

que

* * * * * perl -e '$@#$@$%%@' | grep -e '@#$@$#$@' | sed s/asfdf/asdfa/

ces lignes peuvent aller à l'intérieur d'un seul fichier, chmod + x, et ce fichier à appeler.

Sergio Abreu
la source