Неинтерактивная, нелогинистическая оболочка попытается получить любой скрипт, указанный в $BASH_ENV. Но как гарантировать, что $BASH_ENV будет установлен до того, как задание cron или скрипт сможет установить $BASH_ENV для любого конкретного сеанса? Единственный ли вариант — скомпилировать Bash с жестко закодированным значением?
решение1
Если вы хотите, чтобы загружались все скрипты bash в вашем crontab BASH_ENV
, установите это на уровне crontab.
BASH_ENV=/path/to/startup.bash
12 34 * * * /path/to/bash_script
1 23 1 * * /path/to/other_bash_script
Если вы хотите установить BASH_ENV
только для определенной записи, установите ее там. Тогда она BASH_ENV
не будет установлена для кода, указанного в самом crontab, но в любом случае это плохая идея помещать туда что-то сложное.
12 34 * * * export BASH_ENV=/path/to/startup.bash; /path/to/bash_script
1 23 1 * * /path/to/other_bash_script
Если вы хотите, чтобы определенный скрипт всегда загружал какой-либо файл конфигурации, загрузите его непосредственно из скрипта.
#!/bin/bash
. /path/to/configuration.bash
…
решение2
BASH_ENV
читается только внеинтерактивныйshell, и только если эта оболочка bash (и не вызвана под именем sh
, также). Нелогиненная, интерактивная оболочка не ищет $BASH_ENV
:
$ export BASH_ENV=/home/cuonglm/bash-env.sh
$ bash -lci '. test.sh'
QWERTY
$ bash -lc '. test.sh'
BASH_ENV read
QWERTY
$ bash -ci '. test.sh'
QWERTY
$ bash -c '. test.sh'
BASH_ENV read
QWERTY
Нет стандартного файла, который запускается в неинтерактивной оболочке для пользователя. Вы должны установить его в отдельном файле, а затем получить его источник:
bash -c '. ~/.profile; echo 123'
Или вы можете задать его в каком-нибудь системном конфигурационном файле, например /etc/environment
или /etc/bashrc.bashrc
.