экранирование двойных кавычек и знаков процента (%) в cron

75

Следующая команда работает из командной строки, но не из crontab.

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

Мне нужно добавить его в ежедневный хрон.

shantanuo
источник
Ваш пример удивителен,% окружен двойными, простыми и обратными кавычками. Не оставляя надежды на то, что экранирование может сработать.
Tuxayo

Ответы:

126

Вы должны избежать %знаков. Они имеют особое значение в 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.
БМК
источник
7
+1 Очень интересно, я тоже этого не знал. Удивлен, я не столкнулся с этим.
Кайл Смит
3
Ну, я просто столкнулся с этим. Я использовал date +%Fи получал никуда
Адамо
2
Этот синтаксис имеет какое-либо полезное использование? С SHELL=/bin/bash, я всегда могу переписать cat %Hello worldкак cat <<<'Hello world'. Я не вижу необходимости в особом синтаксисе.
Витико
@Witiko Если «специальный синтаксис», о котором вы спрашиваете, это обратная косая черта, чтобы избежать процентов, то собственный вопрос OP является примером, где он необходим: аргументы команды, которые требуют процентов, особенно программа даты, которая была бы довольно популярна в команда crontab. Если вы на самом деле спрашиваете, почему cron имеет этот гоча в первую очередь: то есть: заменяет перевод строки вместо процентов, тогда, я думаю, это так, что вы можете предоставить в одной строке, которая требуется crontab, «команду», состоящую из двух или более вспомогательных команд.
gwideman
Последний. И, как я уже говорил, с bash можно сделать то же самое. Не нужно засорять синтаксис Cron.
Witiko
7

Это не дает прямого ответа на ваш вопрос, но я бы посоветовал вам создать файл сценария в / usr / local / bin (или ~ / bin или что-нибудь подходящее) и вызвать его из cron. Проще протестировать и отредактировать.

Рэнди Оррисон
источник
2
По моему опыту, поддерживать 50 строк в crontab намного проще, чем поддерживать 50 крошечных файлов. Вам наверняка захочется превратить более длинные сценарии в файлы сценариев, но это может быть излишним.
Витико