Comment garantir la disponibilité de $ BASH_ENV

8

Un shell non interactif et sans connexion essaiera de source n'importe quel script spécifié dans $ BASH_ENV. Mais comment puis-je garantir que $ BASH_ENV est défini avant qu'un travail cron ou un script ait la possibilité de définir $ BASH_ENV pour une session particulière? La seule option pour compiler Bash avec est-elle codée en dur?

Igorio
la source
Découvrez pam_env. Ou simplement source $HOME/.envdans tous vos scripts.
Mikel

Réponses:

7

Si vous voulez que tous les scripts bash de votre crontab se chargent BASH_ENV, définissez-le au niveau de crontab.

BASH_ENV=/path/to/startup.bash
12 34 * * * /path/to/bash_script
1 23 1 * * /path/to/other_bash_script

Si vous souhaitez définir BASH_ENVuniquement pour une entrée particulière, définissez-le là. Ensuite BASH_ENV, le code répertorié dans la crontab ne sera pas défini, mais c'est quand même une mauvaise idée d'y mettre quelque chose de complexe.

12 34 * * * export BASH_ENV=/path/to/startup.bash; /path/to/bash_script
1 23 1 * * /path/to/other_bash_script

Si vous souhaitez qu'un script particulier charge toujours un fichier de configuration, chargez-le directement à partir du script.

#!/bin/bash
. /path/to/configuration.bash
Gilles 'SO- arrête d'être méchant'
la source
Pourquoi avez - vous pris la peine exporting $BASH_ENVsi vous configurez que pour un seul processus? C'est juste BASH_ENV=/path/to/startup.bash /path/to/bash_scriptla manière sensée de le faire.
mikeserv
4

BASH_ENVn'est lu que dans un shell non interactif , et uniquement si ce shell est bash (et n'est pas appelé non plus sous le nom sh). Un shell interactif sans connexion ne recherche pas $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

Aucun fichier standard n'est exécuté dans un shell non interactif pour l'utilisateur. Vous devez le placer dans un fichier séparé puis le source:

bash -c '. ~/.profile; echo 123'

Ou vous pouvez le définir dans un fichier de configuration à l'échelle du système comme /etc/environmentou /etc/bashrc.bashrc.

cuonglm
la source
J'espérais que / etc / environment fonctionnerait, mais il ne provient d'aucun shell dans Mac OS 10.6 pour autant que je sache. /etc/bashrc.bashrc semble intrigant, mais j'ai du mal à retrouver les informations à ce sujet. Ou est-ce une faute de frappe?
Igorio