Un shell no interactivo y sin inicio de sesión intentará obtener cualquier script especificado en $BASH_ENV. Pero, ¿cómo garantizo que $BASH_ENV esté configurado antes de que un trabajo cron o script tenga la posibilidad de configurar $BASH_ENV para cualquier sesión en particular? ¿Es la única opción para compilar Bash codificado?
Respuesta1
Si desea que se carguen todos los scripts bash en su crontab BASH_ENV
, configúrelo en el nivel de crontab.
BASH_ENV=/path/to/startup.bash
12 34 * * * /path/to/bash_script
1 23 1 * * /path/to/other_bash_script
Si desea configurar BASH_ENV
solo para una entrada en particular, configúrelo allí. Entonces BASH_ENV
no se configurará para el código que figura en el crontab, pero de todos modos es una mala idea poner algo complejo allí.
12 34 * * * export BASH_ENV=/path/to/startup.bash; /path/to/bash_script
1 23 1 * * /path/to/other_bash_script
Si desea que un script en particular cargue siempre algún archivo de configuración, cárguelo directamente desde el script.
#!/bin/bash
. /path/to/configuration.bash
…
Respuesta2
BASH_ENV
sólo se lee en unno interactivoshell, y solo si ese shell es bash (y tampoco se llama con el nombre sh
). Un shell interactivo sin inicio de sesión no busca $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
No existe ningún archivo estándar que se ejecute en un shell no interactivo para el usuario. Debe configurarlo en un archivo separado y luego obtenerlo:
bash -c '. ~/.profile; echo 123'
O puede configurarlo en algún archivo de configuración de todo el sistema como /etc/environment
o /etc/bashrc.bashrc
.