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 :sh
para vi
, ou quando você cria uma nova janela de terminal.
Originalmente, o shell era lido ~/.profile
quando 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 ~/.profile
era 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. csh
foi projetado para ler em dois scripts de inicialização diferentes. ~/.login
era lida apenas quando um usuário fazia login, e a sugestão para isso era se fosse argv[0]
iniciada '-'
. ~/.cshrc
foi lido toda vez que o shell foi iniciado. Em geral, colocamos aliases ~/.cshrc
e tudo mais ~/.login
. csh
também suportado ~/.logout
, que na maioria dos casos apenas limpou a tela e foi executado fortune
.
Outras conchas adotaram essas mesmas características. ksh
leria ~/.kshrc
, bash
leria ~/.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.