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.