Como garantir a disponibilidade de $ BASH_ENV

8

Um shell não interativo e sem logon tentará obter qualquer script especificado em $ BASH_ENV. Mas como garanto que $ BASH_ENV seja definido antes que um trabalho ou script cron tenha a chance de definir $ BASH_ENV para qualquer sessão em particular? É a única opção para compilar o Bash com ele codificado?

Igorio
fonte
Confira pam_env. Ou apenas fonte $HOME/.envem todos os seus scripts.
22614 Mikel

Respostas:

7

Se você deseja que todos os scripts bash no seu crontab carreguem BASH_ENV, configure-o no nível do crontab.

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

Se você deseja definir BASH_ENVapenas para uma entrada específica, defina-a lá. Então BASH_ENVnão será definido para o código listado no próprio crontab, mas é uma má idéia colocar qualquer coisa complexa lá de qualquer maneira.

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

Se você deseja que um script específico sempre carregue algum arquivo de configuração, carregue-o diretamente de dentro do script.

#!/bin/bash
. /path/to/configuration.bash
Gilles 'SO- parar de ser mau'
fonte
Por que você se incomoda exporting $BASH_ENVse você está definindo-o apenas para um único processo? Apenas BASH_ENV=/path/to/startup.bash /path/to/bash_scripté a maneira sensata de fazê-lo.
mikeserv
4

BASH_ENVé lido apenas em um shell não interativo e somente se esse shell for bash (e também não for chamado sob o nome sh). Um shell interativo sem login não procura $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

Não há arquivo padrão que seja executado no shell não interativo para o usuário. Você deve configurá-lo em um arquivo separado e depois obtê-lo:

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

Ou você pode configurá-lo em algum arquivo de configuração em todo o sistema, como /etc/environmentou /etc/bashrc.bashrc.

cuonglm
fonte
Eu esperava que o / etc / environment funcionasse, mas não é fornecido por nenhum shell do Mac OS 10.6, tanto quanto eu sei. O /etc/bashrc.bashrc parece intrigante, mas estou tendo dificuldade em rastrear qualquer informação sobre ele. Ou isso é um erro de digitação?
Igorio 23/06