Как гарантировать доступность $BASH_ENV

Как гарантировать доступность $BASH_ENV

Неинтерактивная, нелогинистическая оболочка попытается получить любой скрипт, указанный в $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.

Связанный контент