Існує три загальні причини, коли команди cron поводяться по-різному в порівнянні з командами, введеними безпосередньо в інтерактивну оболонку, у грубому порядку спільності:
- Cron забезпечує обмежене середовище, наприклад, мінімум
$PATH
та інші очікувані змінні відсутні.
- Cron викликає
/bin/sh
за замовчуванням, тоді як ви можете інтерактивно використовувати іншу оболонку.
- Cron звертається до
%
персонажа спеціально (він перетворюється на новий рядок у команді).
- Cron не забезпечує термінальне чи графічне середовище.
Ви повинні передувати всім %
символам \
у файлі crontab, який повідомляє cron просто ввести відсоток у команді. Пам'ятайте, що коли ви використовуєте date
команду в роботі cron.
55 8 * * 3 /usr/bin/php /home/mark/dev/processes/customClient/events.php > "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
0 9 * * 3 /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s "Events from $(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d)" -a "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
Я також виправив деякі проблеми цитування:
- Це не викликало у вас інших проблем, ніж з розбірливістю, але ви не повинні використовувати задні команди для заміни команд. Використовуйте
$(…)
натомість: правила його розбору простіші.
- Завжди використовуйте подвійні лапки навколо підстановок змінних та команд:
"$somevariable"
, "$(somecommand)"
. Тут відсутність лапок була нешкідлива, оскільки date
команда ніколи не повертала жодного спеціального символу для використовуваних форматів, але ви повинні ретельно пам’ятати, які символи є спеціальними, і перевіряти це кожен раз, коли ви залишаєте заміну без котирування. Нехай це буде просто, завжди використовуйте подвійні лапки, якщо ви не хочете, щоб в результаті відбулося розщеплення полів та створення імен файлів.
- У вас були окремі цитати, що запобігали розширенню навколо деяких підстановок команд. Використовуйте замість цього подвійні лапки.
/bin/sh: 1: Syntax error: EOF in backquote substitution
Для першої роботи з крон./bin/sh: 1: Syntax error: Unterminated quoted string
Для другої роботи з крон.