Os arquivos de inicialização de sessão são estranhos, por razões históricas histéricas .
Há muito tempo, você fez login no console, ponto final. Quando você logou, você tem um shell, e o shell carregaria algum arquivo de inicialização. Para shells no estilo Bourne, há dois arquivos de inicialização: /etc/profile
(para todos os usuários) e ~/.profile
(para cada usuário). O arquivo de inicialização pode definir variáveis de ambiente como PATH
, carregar aplicativos que você deseja executar em cada sessão (por exemplo, um indicador de email), etc. Se um shell não for um login shell , não é necessário iniciar nada nem definir variáveis de ambiente, portanto, não há necessidade de executar qualquer arquivo de inicialização. Certamente não há…
Na verdade, os shells gradualmente ganharam recursos interativos, portanto, há necessidade de um arquivo de inicialização para shells interativos. Ksh tem ~/.kshrc
, bash tem ~/.bashrc
, zsh tem ~/.zshrc
.
Logins interativos remotos executam /etc/profile
e ~/.profile
. Mas eles não são adequados para logins não interativos porque podem iniciar programas não interativos. Infelizmente, nenhum padrão surgiu para um arquivo de inicialização para logins não interativos.
Você pode executar /etc/profile
e ~/.profile
manualmente se tiver certeza de que eles não produzirão nenhuma saída ou iniciarão qualquer programa, basta definir variáveis de ambiente.
ssh foo '. /etc/profile; . ~/.profile; somecommand'
Se você tem partes no seu .profile
que só fazem sentido em uma sessão interativa, você pode colocá-las dentro de uma instrução condicional.
## (in ~/.profile)
case $- in
*i*) # the shell is interactive
newmail;;
esac
Se o seu shell de login é bash, você pode tirar proveito de uma peculiaridade: o arquivo de inicialização ~/.bashrc
é lido por shells interativos e também por shells não interativos cujo processo pai é chamado rshd
ou sshd
. Outras conchas não têm essa peculiaridade.
## (in ~/.bashrc)
case $- in
*i*) # interactive shell: set prompt, completion settings, key bindings, etc.
…;;
*) # non-interactive shell: our parent must be rshd or sshd
. ~/.profile;;
esac