
Используемый мной файл crontab более сложен, но я разбил задачу на минимальный набор задач.
Мой crontab работает так:
mypath='/home/user/opt/script_home'
myscript='/home/user/opt/script_home/myscript.py'
* * * * * "$myscript"
Но не так:
mypath='/home/user/opt/script_home'
myscript="${mypath}/myscript.py"
* * * * * "$myscript"
Сообщение об ошибке в maildir:
/bin/sh: ${mypath}/myscript.py: No such file or directory
Интерпретатор Python доступен по ограниченной переменной cron $PATH, так что проблема не в этом.
Редактировать: Кроме того, если я запускаю crontab с помощью bash или sh, он работает без ошибок. (После удаления * * * * *, конечно)
Может быть, я упускаю что-то очень простое, но я уже некоторое время обдумываю это и ищу в интернете. Но пока мне не повезло с параметрами поиска. Crontab работает с уродливым использованием общего пути в нескольких позициях, но это нехороший код и поэтому он меня беспокоит. Пожалуйста, помогите мне выбраться из моих мучений =)
решение1
Короче говоря: это невозможно.
в соответствии сman 5 crontab
Строка значений не анализируется на предмет подстановок окружения или замены переменных, поэтому строки типа
PATH = $HOME/bin:$PATH
не будет работать так, как вы могли бы ожидать.
cron
Парсер не такой мощный, как bash
у .
решение2
Вы можете настроить эту переменную mypath в файле .bash_profile или .bashrc, тогда она будет доступна.
vi .bash_profile or vi .bashrc
затем добавьте указанный ниже путь и сохраните
mypath='/home/user/opt/script_home'
решение3
Поскольку cron не является ни интерактивным, ни оболочкой входа, ни .bashrc, ни .bash_profile не являются исходными файлами. Поэтому, если вы определите mypath в этих файлах, у вас не будет этой переменной при использовании cron. Насколько мне известно, единственный способ иметь ее в cron — это определить ее напрямую (т. е. без подстановок окружения или замены переменных, как было сказано ранее) в скрипте crontab.