Um shell é iniciado quando você faz login, mas também é iniciado por programas como make
ou quando você executa um script de shell ou quando você digita :sh
to vi
ou quando cria uma nova janela de terminal .
Originalmente, o shell lia em ~/.profile
quando você efetuava login ou executava su
. Esse script faria coisas como anunciar se você tinha um novo e-mail, personalizaria sua exclusão e mataria caracteres e configuraria e exportaria as variáveis TERM e PATH. Quando iniciado em quase qualquer outro contexto, o shell não leu ~/.profile
, porque a maioria dessas coisas seria redundante. Era esperado que você exportasse quaisquer variáveis importantes do shell para o novo shell.
A maneira como o shell sabia se deveria ler em ~/.profile
era verificar se o primeiro caractere de argv[0]
, também conhecido como $0
, era '-'
.
Começando com csh
, os aliases foram introduzidos. Os aliases não foram exportados no ambiente. csh
foi projetado para ler dois scripts de inicialização diferentes. ~/.login
foi lido somente quando um usuário efetuou login e a sugestão para isso foi se argv[0]
começou com '-'
. ~/.cshrc
foi lido toda vez que o shell foi iniciado. Em geral, um colocou alias em ~/.cshrc
e tudo mais em ~/.login
. csh
também suportou ~/.logout
, que na maioria dos casos apenas limpou a tela e executou fortune
.
Outros shells adotaram esses mesmos recursos. ksh
leria em ~/.kshrc
, bash
leria em ~/.bashrc
, e onde você colocaria suas definições de alias.
Portanto, para encurtar a história, o aplicativo que gera um shell decide se deve ser um "shell de login", caso em que há o '-'
no início ou um shell normal. Na maioria dos casos, um shell que será interativo é iniciado como um shell de login, e um shell significa apenas executar alguns comandos, como argumentos ou de um script, e então exit é um shell regular.
Mas tudo depende do capricho do aplicativo que inicia o shell.