Tentando entender .bashrc, env e export

3

Disclaimer: Usando o bash.

Eu só preciso de alguma confirmação / correção para entender essas coisas:

  1. env é basicamente exibindo as variáveis do ambiente atual que estão acessíveis para a minha sessão atual E para quaisquer sessões filho (como se eu fosse bash em uma sessão filho).

  2. Se eu fosse definir uma nova variável, como MYMESSAGE="hello world!" , ela só seria visível para a sessão em que a criei. Se eu entrei em uma sessão de criança, eu não seria capaz, por exemplo, de echo $MYMESSAGE .

  3. Eu posso export MYMESSAGE="hello world!" para torná-lo acessível para sessões filhas. export é o mesmo que adicioná-lo ao que quer que env esteja obtendo.

  4. No entanto, só porque você export algo, ele não vai ficar se você fechar suas sessões e reiniciar o terminal. Edite .bashrc no seu diretório /home/username/ e adicione qualquer nova variável ambiental lá, pois este script é executado no login.

O meu entendimento está correto até agora?

Além disso, não entendo totalmente de onde os detalhes de env vêm. A lista de variáveis ambientais é armazenada em algum arquivo e editada / anexada por .bashrc ? Estou apenas tentando entender como tudo isso funciona.

    
por user27186 07.03.2016 / 21:24

3 respostas

4

Você basicamente acertou, porém alguns pontos extras ...

Existem vários "arquivos de inicialização" que o bash pode executar - alguns para compatibilidade com o bourne-shell (sh), outros dependendo de como você começou o bash: Você logou no X? Você logou em um TTY? Você iniciou bash em outro shell (bash-)? O bash é executado como um script (não interativo)? Portanto, .bashrc não é sempre executado, nem pode ser o único arquivo de inicialização. Entretanto, é uma boa idéia "source" (ler e executar) .bashrc nos outros arquivos de inicialização também, então o conteúdo de seu .bashrc é sempre adicionado. Use man bash e olhe especialmente na parte sobre como o bash começa ... a seção FILES também lista os usos de bash dos arquivos, incluindo todos os arquivos de inicialização. Para um aprofundamento, tente info bash .

Além de seus próprios arquivos de inicialização, existem arquivos de inicialização globais "padrão" correspondentes em / etc - normalmente são lidos / executados por bash antes de seus próprios arquivos de inicialização. Existem também outros programas que definem suas próprias variáveis de ambiente, além daquelas definidas pelo bash, que podem complementar ou até mesmo substituir aquelas definidas pelo bash. De particular interesse é o X (a GUI), já que ele irá configurar dois conjuntos diferentes de ambientes, dependendo se o X é iniciado manualmente (com xinit ou startx ) de um VT, ou é iniciado por um "gerenciador de exibição" (por exemplo, xdm ou kdm ) para que você possa fazer login diretamente no X (X é iniciado quando você inicializa e você tem uma caixa de diálogo para nome de usuário / senha em X ).

Mas antes que bash , X ou qualquer outro programa seja iniciado, muito do ambiente - variáveis de ambiente - você estará usando, terá sido configurado, por exemplo, pelo comando login . Muito disso você pode encontrar em /etc/login.defs e outros arquivos de configuração. Por exemplo, a variável PATH será configurada - e será diferente dependendo se você é usuário root ou normal.

Portanto, se você observar os vários arquivos e scripts que são executados como parte do processo de inicialização, inicialização e login; você encontrará a maioria das variáveis que você pode listar com env . No entanto, alguns - como CWD (diretório de trabalho atual) - são configurados (e atualizados) automaticamente pelo próprio shell (bash).

Quando você executa um comando, o que acontece é que o bash usa uma chamada de sistema chamada fork (). bash basicamente faz uma cópia idêntica de si mesmo, com a exceção de que o filho obtém um novo PID (ID do processo) e é o PPID (Parent PID) que é "mãe". Ou seja, são idênticos - incluindo até mesmo as variáveis de ambiente ... assumindo que a variável em questão foi herdada pela primeira vez em relação a ela. Você agora tem duas cópias de export . Em seguida, outro system-call -exec () - é usado, que basicamente substitui o bash-program "in memory" para o filho bash-process, por outro programa - por exemplo, com bash , ls ou ps ( o que você digitou) ... mas as variáveis de ambiente permanecem, então o novo programa herda seu ambiente de mutt . Este filho agora controla seu terminal (a menos que você coloque o comando em segundo plano com &) até que ele termine, enquanto o seu bash-shell original (basicamente) dorme. Quando o comando terminar, você retornará ao seu bash -shell original, que está pronto para outro comando.

    
por 07.03.2016 / 22:39
2

O ambiente não é passado através de um arquivo, mas através da pilha de processos recém-criados e o método para conseguir isso é passar o ambiente para a chamada de sistema exec() .

  • env é um comando externo (ao contrário dos comandos internos do shell) e, por esse motivo, env apenas imprime variáveis que são exported do shell.

  • set no outro lado lista todas as variáveis do shell. Alguns deles são exportados.

  • export lista as variáveis do shell que são exportadas pelo shell.

BTW:

  • .bashrc não é executado por shells de login, mas sim por cada shell interativo (bash). Outros shells possuem outros nomes para esse recurso. ksh usa .kshrc e o Bourne Shell usa .shrc .

  • .profile é executado por shells de login. Este arquivo é compartilhado entre todos os shelle compatíveis com Bourne Shell.

por 07.03.2016 / 22:09
0

Seu entendimento está correto.

Seu /home/username/.bashrc acrescenta (ou sobrescreve) as configurações em /etc/bash.bashrc

Existem também algumas configurações relevantes em / etc / profile, e você pode ter um /home/username/.profile, mas elas existem principalmente por razões de compatibilidade histórica. (Eles são um artefato do shell Bourne, no qual o Bash é baseado).

    
por 07.03.2016 / 21:45