Lançamento do Bash em detalhes

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 

Source: https://habr.com/ru/post/pt452410/


All Articles