Назад | Перейти на главную страницу

Использовать переменные в путях в crontab

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.