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_ENV
apenas uma entrada específica, defina-a lá. Então BASH_ENV
nã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_ENV
só é 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/environment
ou /etc/bashrc.bashrc
.