Um shell é iniciado quando você entra, mas também é iniciada por programas como make, ou quando você executar um script shell, ou quando você digita :shpara vi, ou quando você cria uma nova janela de terminal.
Originalmente, o shell era lido ~/.profilequando você fazia login ou era executado su. Esse script faria coisas como anunciar se você tinha um novo email, personalizar seus caracteres de apagar e matar e definir e exportar as variáveis TERM e PATH. Quando iniciado em quase qualquer outro contexto, o shell não leu ~/.profile, porque fazer a maioria dessas coisas seria redundante. Esperava-se que você exportasse quaisquer variáveis importantes do shell para o novo shell.
A maneira como o shell sabia se deveria ler ~/.profileera verificar se o primeiro caractere de argv[0], aka $0, era '-'.
Começando com csh, os aliases foram introduzidos. Os aliases não foram exportados para o ambiente. cshfoi projetado para ler em dois scripts de inicialização diferentes. ~/.loginera lida apenas quando um usuário fazia login, e a sugestão para isso era se fosse argv[0]iniciada '-'. ~/.cshrcfoi lido toda vez que o shell foi iniciado. Em geral, colocamos aliases ~/.cshrce tudo mais ~/.login. cshtambém suportado ~/.logout, que na maioria dos casos apenas limpou a tela e foi executado fortune.
Outras conchas adotaram essas mesmas características. kshleria ~/.kshrc, bashleria ~/.bashrc, e era aí que 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"; nesse caso, existe um '-'no início ou um shell comum. Na maioria dos casos, um shell que será interativo é iniciado como um shell de login, e um shell destinado apenas a executar alguns comandos, como argumentos ou a partir de um script, e sair é um shell comum.
Mas tudo depende do capricho do aplicativo que inicia o shell.