Se você encontrou esta página em uma pesquisa, provavelmente está tentando resolver algum problema com a execução do bash.
É possível que o ambiente do bash não defina uma variável de ambiente e você não entenda o porquê. Você pode ter inserido algo em vários arquivos de inicialização do bash ou em perfis ou em todos os arquivos aleatoriamente até que funcionasse.
De qualquer forma, o objetivo desta nota é descrever o procedimento de inicialização do bash da maneira mais fácil possível, para que você possa lidar com problemas.
Gráfico
Este fluxograma resume todos os processos ao iniciar o bash.

Agora vamos dar uma olhada em cada parte.
Login Shell?
Primeiro, você precisa escolher se está ou não no shell de login.
O shell de logon é o primeiro shell que você insere quando faz login para uma sessão interativa. O shell de logon não requer um nome de usuário e senha. Você pode forçar o lançamento do shell de login adicionando o sinalizador
--login
ao chamar o
bash
, por exemplo:
bash --login
O shell de login configura o ambiente base quando você executa o shell bash pela primeira vez.
Interativo?
Então você determina se o shell é interativo ou não.
Isso pode ser verificado pela presença da variável
PS1
(define a função de entrada do comando):
if ["$ {PS1-}"]; então
eco interativo
mais
eco não interativo
fi
Ou veja se a opção
-i
está configurada usando uma variável hífen especial no bash, por exemplo:
$ echo $ -
Se houver um
i
na saída, o shell será interativo.
No shell de login?
Se você estiver no shell de login, o bash procurará o arquivo
/etc/profile
e será executado, se existir.
Em seguida, ele procura por qualquer um desses três arquivos na seguinte ordem:
~ / .bash_profile
~ / .bash_login
~ / .profile
Quando encontra um, o lança e pula os outros.
Em um shell interativo?
Se você estiver em um shell interativo sem um login (shell que não seja de login), presume-se que você já tenha visitado o shell de login, o ambiente está configurado e será herdado.
Nesse caso, os dois arquivos a seguir são executados em ordem, se existirem:
/etc/bash.bashrc
~ / .bashrc
Não é uma opção única?
Se você não estiver no shell de logon nem no shell interativo, seu ambiente estará realmente vazio. Isso causa muita confusão (consulte os trabalhos do cron abaixo).
Nesse caso, o bash analisa a variável
BASH_ENV
do seu ambiente e executa o arquivo correspondente listado lá.
Dificuldades típicas e regras práticas
Empregos em Cron
Em 95% dos casos, depurei o lançamento do bash devido ao fato de o trabalho cron não funcionar conforme o esperado.Essa maldita tarefa
funciona bem quando eu a executo na linha de comando, mas falha na inicialização do crontab .
Existem
dois motivos :
- Trabalhos Cron não são interativos.
- Diferentemente dos scripts de linha de comando, os trabalhos cron não herdam o ambiente do shell.
Você geralmente não percebe ou se importa que o script do shell não seja interativo porque o ambiente é herdado do shell interativo. Isso significa que todos os
PATH
e
alias
configurados conforme o esperado.
É por isso que você geralmente precisa definir um
PATH
específico para a tarefa cron, como aqui:
* * * * * PATH = $ {PATH}: / caminho / para / meu / programa / pasta meuprograma
Scripts que se chamam
Outro problema comum é quando os scripts são configurados por engano para chamar um ao outro. Por exemplo,
/etc/profile
refere-se a
~/.bashrc
.
Geralmente isso acontece quando alguém tenta corrigir algum tipo de erro e tudo parece funcionar. Infelizmente, quando você precisa separar esses diferentes tipos de sessões, surgem novos problemas.
Imagem do Sandbox Docker
Para experimentar a inicialização do shell, criei uma imagem do Docker que você pode usar para depurar a inicialização do shell em um ambiente seguro.
Lançamento:
$ docker run -n bs -d imiell/bash_startup $ docker exec -ti bs bash
O Dockerfile está
aqui .
Para forçar o login e simular o shell de login:
$ bash --login
Para verificar o conjunto de variáveis
BASH_ENV
:
$ env | grep BASH_ENV
Para depurar o
crontab
script simples será executado a cada minuto (em
/root/ascript
):
$ crontab -l $ cat /var/log/script.log