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