Como garantir a disponibilidade de $BASH_ENV

Como garantir a disponibilidade de $BASH_ENV

Um shell não interativo e sem login tentará obter qualquer script especificado em $BASH_ENV. Mas como posso garantir que $BASH_ENV seja definido antes que um cron job ou script tenha a chance de definir $BASH_ENV para qualquer sessão específica? A única opção é compilar o Bash com ele codificado?

Responder1

Se você deseja que todos os scripts bash em seu crontab sejam carregados BASH_ENV, defina-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ê quiser definir BASH_ENVapenas 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á ideia colocar algo complexo 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

Responder2

BASH_ENVsó é lido em umnão interativoshell, e somente se esse shell for bash (e também não for chamado pelo 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 existe um arquivo padrão executado em um shell não interativo para o usuário. Você deve configurá-lo em um arquivo separado e depois originá-lo:

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

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

informação relacionada