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


75

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

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

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


Ваш пример удивителен,% окружен двойными, простыми и обратными кавычками. Не оставляя надежды на то, что экранирование может сработать.
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 крошечных файлов. Вам наверняка захочется превратить более длинные сценарии в файлы сценариев, но это может быть излишним.
Витико
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.