Executando o Bash em detalhes

Se você encontrou esta página em uma pesquisa, provavelmente está tentando resolver algum problema ao executar o bash.

Talvez o seu ambiente bash não esteja definindo uma variável de ambiente e você não entende o porquê. Você pode ter preso algo em vários arquivos ou perfis de inicialização do bash ou em todos os arquivos aleatoriamente até que funcionasse.

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

Диаграмма

Este fluxograma resume todos os processos ao executar o bash.

Executando o Bash em detalhes

Agora vamos dar uma olhada em cada parte.

Login?

Primeiro você precisa escolher se está no shell de login ou não.

O shell de login é o primeiro shell que você insere ao efetuar login em uma sessão interativa. O shell de login não requer nome de usuário e senha. Você pode forçar o início do shell de login adicionando um sinalizador --login ao ligar bash, Por exemplo:

bash --login

O shell de login configura o ambiente base quando você inicia 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 (instala a função de entrada de comando):

se [ "${PS1-}" ]; então echo interativo senão echo não interativo fi

Ou veja se a opção está definida -i, usando uma variável hífen especial - no bash, por exemplo:

$eco$-

Se houver um símbolo na saída i, então o shell é interativo.

No shell de login?

Se você estiver em um shell de login, o bash procurará o arquivo /etc/profile e é executado se existir.

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

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

Quando encontra um, ele o inicia e ignora os outros.

Em um shell interativo?

Se você estiver em um shell sem login, presume-se que você já esteve em um shell de login, o ambiente está configurado e será herdado.

Neste caso, os dois arquivos a seguir são executados em ordem, se existirem:

/etc/bash.bashrc ~/.bashrc

Nenhuma opção?

Se você não estiver em um shell de login ou em um shell interativo, seu ambiente estará realmente vazio. Isso causa muita confusão (veja abaixo sobre cron jobs).

Neste caso, o bash olha para a variável BASH_ENV seu ambiente e cria o arquivo correspondente especificado lá.

Dificuldades comuns e regras práticas

tarefas agendadas

95% das vezes que depuro a inicialização do bash é porque o cron job não está funcionando conforme o esperado.

Essa maldita tarefa funciona bem quando executo na linha de comando, mas falha quando executo no crontab.

é duas razões:

  • Os cron jobs não são interativos.
  • Ao contrário dos scripts de linha de comando, os cron jobs não herdam o ambiente shell.

Normalmente você não notará nem se importará com o fato de um script de shell não ser interativo porque o ambiente herda do shell interativo. Isto significa que tudo PATH и alias configurado como você esperaria.

É por isso que muitas vezes é necessário definir um PATH para uma tarefa cron como esta:

* * * * * PATH=${PATH}:/caminho/para/meu/programa/pasta meuprograma

Scripts chamando um ao outro

Outro problema comum é quando os scripts são configurados erroneamente para chamar uns aos outros. Por exemplo, /etc/profile apela para ~/.bashrc.

Isso geralmente acontece quando alguém tenta consertar algum erro e tudo parece funcionar. Infelizmente, quando é necessário separar esses diferentes tipos de sessões, surgem novos problemas.

Imagem Docker em sandbox

Para experimentar a execução de um shell, criei uma imagem Docker que pode ser usada para depurar a execução de um shell em um ambiente seguro.

Lançar:

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

Dockerfile está localizado aqui.

Para forçar o login e simular um shell de login:

$ bash --login

Para testar um conjunto de variáveis BASH_ENV:

$ env | grep BASH_ENV

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

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

Fonte: habr.com

Adicionar um comentário