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 работает с некрасивым использованием общего пути в нескольких позициях, но это плохой код и поэтому меня беспокоит. Пожалуйста, помогите мне выйти из агонии =)
TL; DR: вы не можете.
в соответствии с man 5 crontab
Строка значения не анализируется на предмет подстановки окружения или замены переменных, поэтому строки вроде
PATH = $HOME/bin:$PATH
не будет работать так, как вы могли ожидать.
cron
парсер не такой мощный, как bash
с.
Вы можете настроить mypath для этой переменной в файле .bash_profile или .bashrc, тогда она будет доступна.
vi .bash_profile or vi .bashrc
затем добавьте путь ниже и сохраните
mypath='/home/user/opt/script_home'
Поскольку cron не является ни интерактивным, ни оболочкой входа, ни .bashrc, ни .bash_profile не используются. Поэтому, если вы определите mypath в этих файлах, у вас не будет этой переменной при использовании cron. Насколько мне известно, единственный способ иметь его в cron - это определить его напрямую (то есть без подстановки окружения или замены переменных, как было сказано ранее) в скрипте crontab.