Как я могу выполнить «дату» внутри задания вкладки cron?

Я хочу создать файл журнала для скрипта cron, который имеет текущий час в имени файла журнала. Это команда, которую я пытался использовать:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log 

К сожалению, я получаю это сообщение, когда это выполняется:

 /bin/sh: -c: line 0: unexpected EOF while looking for matching ``' /bin/sh: -c: line 1: syntax error: unexpected end of file 

Я попытался вырваться из части date разными способами, но без большой удачи. Возможно ли, чтобы это произошло в строке в файле crontab или мне нужно создать сценарий оболочки для этого?

Короткий ответ:

Попробуй это:

 0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+\%d"`.log 

Обратите внимание на обратную косую черту, пропускающую знак % .

Длительный ответ:

Сообщение об ошибке предполагает, что оболочка, которая выполняет вашу команду, не видит второго символа обратного тика:

/ bin / sh: -c: строка 0: неожиданный EOF при поиске соответствия “ '

Это также подтверждается вторым сообщением об ошибке, которое вы получили, когда вы попробовали один из других ответов:

/ bin / sh: -c: строка 0: неожиданный EOF при поиске соответствия `) '

Справочная таблица crontab подтверждает, что команда считывается только до первого неэкранированного знака % :

Поле «шестое» (остальная часть строки) указывает команду для запуска. Вся командная часть строки, вплоть до символа новой строки или%, будет выполнена / bin / sh или оболочкой, указанной в переменной SHELL файла cron. Процентные знаки (%) в команде, если не сбрасываются с помощью обратного слэша (\), будут изменены на символы новой строки, а все данные после первого% будут отправлены команде в качестве стандартного ввода.

Вы также можете поместить свои команды в файл оболочки, а затем выполнить файл оболочки cron.

jobs.sh

 echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log 

хрон

 0 * * * * sh jobs.sh 

Если вы хотите, чтобы строка форматирования даты была переменной (чтобы избежать дублирования всей строки), НЕ ВЫЙДИТЕ % и НЕ помещайте ее в $()

Например, объявив строку, просто напишите:

 DATEVAR=date +%Y%m%d_%H%M%S 

Затем напишите оператор cron с $($VARIABLE_NAME) следующим образом:

 * * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log 

Благодаря cyberx86 его / ее ответ на ServerFault может быть завершен: