Execução do Bash em detalhes

Se você encontrou esta página na busca, provavelmente está tentando resolver algum problema com a execução do bash.

Pode ser que, no seu ambiente, o bash não esteja definindo a variável de ambiente e você não entenda o porquê. Talvez você tenha colocado algo nos diferentes arquivos de inicialização do bash ou nos perfis, ou em todos os arquivos ao acaso, até que funcionasse.

De qualquer forma, o objetivo desta nota é expor o procedimento de execução do bash da maneira mais simples possível, para que você possa lidar com os problemas.

Diagrama

Este fluxograma resume todos os processos na execução do bash.

Execução do Bash em detalhes

Agora vamos analisar cada parte em mais detalhes.

Shell de Login?

Primeiro, você precisa decidir se está em um shell de login (login shell) ou não.

Um shell de login é o primeiro shell que você acessa ao entrar no sistema para uma sessão interativa. O shell de login não requer inserção de nome de usuário e senha. Você pode forçar a execução de um shell de login adicionando a flag --login na chamada bash, por exemplo:

bash --login

O shell de login configura o ambiente básico na primeira execução do shell bash.

Interativo?

Então, você determina se o shell é interativo ou não.

Isso pode ser verificado pela presença da variável PS1 (ela define a função de entrada de comandos):

if [ "${PS1-}" ]; then
  echo interactive
else
  echo non-interactive
fi

Ou verificar se o parâmetro -iestá definido, usando uma variável especial de hífen - no bash, por exemplo:

$ echo $-

Se a saída contiver o caractere i, então o shell é interativo.

No shell de login?

Se você estiver em um shell de login, o bash procura o arquivo /etc/profile e o executa, se existir.

Depois, procura qualquer um desses três arquivos na seguinte ordem:

~/.bash_profile
~/.bash_login
~/.profile

Quando encontra um, o executa e ignora os outros.

No shell interativo?

Se você estiver em um shell interativo sem login (non-login shell), presume-se que você já passou pelo shell de login, o ambiente está configurado e será herdado.

Nesse caso, os seguintes dois arquivos serão executados em ordem, se existirem:

/etc/bash.bashrc
~/.bashrc

Nenhuma opção?

Se você não estiver nem em um shell de login, nem em um shell interativo, seu ambiente realmente ficará vazio. Isso causa bastante confusão (veja abaixo sobre tarefas cron).

Nesse caso, o bash verifica a variável BASH_ENV do seu ambiente e cria o arquivo correspondente que lá está especificado.

Dificuldades típicas e regras empíricas

Tarefas cron

Em 95% dos casos, a depuração do início do bash está relacionada ao fato de que a tarefa cron não funciona como esperado.

Essa tarefa maldita funciona normalmente quando a executo na linha de comando, mas falha ao ser executada no crontab..

Aqui Duas razões:

  • Tarefas cron não são interativas.
  • Ao contrário dos scripts na linha de comando, as tarefas cron não herdam o ambiente do shell.

Normalmente, você não percebe ou não se importa com o fato de que um script de shell não é interativo, porque o ambiente é herdado de um shell interativo. Isso significa que tudo caminhos e alias está configurado como você espera.

É por isso que muitas vezes é necessário definir um específico caminhos para a tarefa cron, como aqui:

* * * * * PATH=${PATH}:\/path\/to\/my\/program\/folder myprogram

Scripts que chamam uns aos outros

Outro problema comum é quando scripts erroneamente configurados chamam uns aos outros. Por exemplo, /etc/profile acessa o ~/.bashrc.

Normalmente, isso acontece quando alguém tentou corrigir um erro e parece que tudo funcionou. Infelizmente, ao tentar separar esses diferentes tipos de sessões, surgem novos problemas.

Imagem Docker em Sandbox

Para experimentar com o início do shell, criei uma imagem Docker que pode ser usada para depurar o início do shell em um ambiente seguro.

Início:

$ docker run -n bs -d imiell\/bash_startup
$ docker exec -ti bs bash

O Dockerfile está aqui.

Para forçar o login e simular uma shell de entrada:

$ bash --login

Para verificar o conjunto de variáveis BASH_ENV:

$ env | grep BASH_ENV

Para depuração crontab a cada minuto, um script simples será executado (no /root/ascript):

$ crontab -l
$ cat \/var\/log\/script.log

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster