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.