Doppelte Anführungszeichen und Prozentzeichen (%) in Cron werden ignoriert

75

Der folgende Befehl funktioniert von der Eingabeaufforderung aus, jedoch nicht von crontab.

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

Ich muss es täglich cron hinzufügen.

shantanuo
quelle
Ihr Beispiel ist erstaunlich, das% ist von doppelten, einfachen und rückseitigen Anführungszeichen umgeben. Keine Hoffnung zu lassen, dass das Entkommen eines Zitats funktionieren könnte.
Smoking

Antworten:

126

Sie müssen den %Zeichen entkommen . Sie haben in Crontabs eine besondere Bedeutung:

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
quelle
7
+1 Sehr interessant, das wusste ich auch nicht. Überrascht bin ich nicht darauf gestoßen.
Kyle Smith
3
Nun, ich bin gerade darauf gestoßen. Ich benutzte date +%Fund kam nicht weiter
Adamo
2
Hat diese Syntax eine nützliche Verwendung? Mit SHELL=/bin/bash, ich kann immer neu schreiben , cat %Hello worldwie cat <<<'Hello world'. Ich sehe keine Notwendigkeit für eine spezielle Syntax.
Witiko
@Witiko Wenn die "spezielle Syntax", nach der Sie fragen, der umgekehrte Schrägstrich ist, um Prozent zu umgehen, dann ist die Frage des OP ein Beispiel dafür, wo dies erforderlich ist: Befehlsargumente, die Prozent erfordern, insbesondere das Datumsprogramm, das in a sehr beliebt wäre Befehl crontab. Wenn Sie sich tatsächlich fragen, warum cron diesen Punkt zuerst hat: dh: Ersetzt Zeilenvorschub anstelle von Prozent, dann können Sie auf einer einzelnen Zeile, die crontab benötigt, einen "Befehl" eingeben, der aus zwei besteht oder mehr Hilfsbefehle.
Wideman
Letzteres. Und wie gesagt, man kann das auch mit bash machen. Keine Notwendigkeit, die Syntax von Cron zu verunreinigen.
Witiko
7

Dies beantwortet Ihre Frage nicht direkt, aber ich würde vorschlagen, dass Sie eine Skriptdatei in / usr / local / bin (oder ~ / bin oder was auch immer angebracht ist) erstellen und dies von cron aus aufrufen. Es ist einfacher zu testen und zu bearbeiten.

Randy Orrison
quelle
2
Nach meiner Erfahrung ist es viel einfacher, 50 Zeilen in einer Crontab zu verwalten, als 50 winzige Dateien. Sie werden sicher längere Skripte in Skriptdateien umwandeln wollen, aber dies für Einzeiler zu tun kann ein Overkill sein.
Witiko