A ideia é que um usuário tenha (no máximo) um shell de login por host. (Talvez eu deva dizer, um shell de login por host por terminal - se você estiver logado simultaneamente em um host através de vários terminais, você esperaria ter vários shells de login.) Isso normalmente seria (sempre?) O shell primeiro que você recebe após o login (daí o nome). Então, este esquema permite que você especifique ações que você quer que aconteçam apenas uma vez por login e coisas que você quer que aconteçam toda vez que você inicia um novo shell (interativo).
Normalmente, todos os outros shell que você executa após efetuar login
será um descendente (filho de filho de uma criança ...) da shell de login,
e, portanto, herdará muitas configurações
(variáveis de ambiente, umask , etc.) do shell de login.
E, consequentemente, a ideia é que os arquivos de inicialização de login
( .login , .profile , etc.) deve definir as configurações herdáveis,
e deixe .bashrc (ou o que mais você usa) lidar com os
que não são ( set , shopt , variáveis de shell não exportadas, etc.)
Outra noção é que os arquivos de inicialização de login (e somente eles)
deve fazer "trabalho pesado", ou seja, ações intensivas em recursos.
Por exemplo, você pode querer ter certos processos
correndo em segundo plano sempre que você estiver logado
(mas apenas uma cópia (instância) deles).
Você pode querer ter algumas informações de status
(por exemplo, df ou who ) exibido quando você faz login
mas não toda vez que você inicia um novo shell interativo.
Especialmente se você tiver um programa / diálogo interativo
(ou seja, aquele que exige entrada de você)
que você deseja executar toda vez que fizer login
você provavelmente não quer que ele seja executado toda vez que você inicia um novo shell.
Como um exemplo extremo, vinte anos atrás, o Solaris registrou você
para um único shell não-gráfico, não-windowed.
(Eu acredito que isso mudou desde então.)
Foi o trabalho de .login ou .profile (ou qualquer outra coisa)
para iniciar o sistema de janelas, com um comando como startx .
(Isso foi útil
em parte porque havia vários sistemas de janelas disponíveis.
Usuários diferentes tinham preferências diferentes.
Alguns usuários usaram sistemas diferentes em diferentes situações,
e nós tivemos um diálogo em nosso .profile que perguntou
“Qual sistema de janelas você quer usar hoje?”)
Obviamente, você não gostaria que isso acontecesse
toda vez que você abriu uma nova janela ou digitou sh .
Já faz muito tempo desde que eu usei algo diferente de bash
exceto para casos de borda.
(Por exemplo, escrevo scripts com #!/bin/sh ,
Então, em alguns sistemas, meus scripts são executados com dash ,
e em outros eles correm com bash no modo POSIX.
Algumas vezes por ano, corro csh / tcsh por alguns minutos
para ver como ele lida com algo ou para responder a uma pergunta.)
Se você usa vários shells (por exemplo, bash e zsh ) diariamente,
seus padrões podem ser diferentes.
Se o seu shell principal (como definido em /etc/passwd ) for bash ,
talvez você queira invocar um shell de login zsh ,
e, em seguida, talvez invocar alguns não-login zsh shells interativos
subordinado a isso.
Você provavelmente deve evitar ter um shell de login
que é subordinado a outro shell de login do mesmo tipo.
Como mencionado em Diferença entre o Login Shell e o Non-Login Shell? ,
o aplicativo OS X Terminal executa um shell de login, portanto, um usuário típico
normalmente terá várias "camadas de login" em execução simultaneamente.
Este é um modelo um pouco diferente daquele que eu descrevi acima,
e pode exigir que o usuário repensar
o que ele faz em seu arquivo .login ou .profile (ou qualquer outro).
Não sei se os desenvolvedores do OS X documentaram
sua justificativa para essa decisão de projeto.
Mas posso imaginar uma situação em que isso seria útil.
Houve uma época em que eu habitualmente abria um punhado de janelas
quando eu entrei
e eu os colocaria em diferentes cores de texto e de fundo
(escrevendo seqüências de escape ANSI na tela)
para me ajudar a saber qual era qual.
Cores terminais são um exemplo de algo
que não é herdado por crianças-de-filhos,
mas persiste dentro de uma janela.
Então esse é o tipo de coisa que você gostaria de fazer
toda vez que você iniciou uma nova janela do Terminal,
mas não toda vez que você inicia um novo shell interativo.