Historicamente, os arquivos de perfil ( /etc/profile
e ~/.profile
) foram invocados quando você efetuou login (no console de texto, o que mais?) e serviu muitos propósitos:
- Defina variáveis de ambiente e outros parâmetros (por exemplo, umask) para a sessão.
- Execute programas extras no início da sessão (por exemplo, notificação por e-mail).
- Execute o programa para a sessão, se for diferente do shell (por exemplo, outro shell ou X Window).
- Defina os parâmetros do terminal (por exemplo,
stty
).
- Defina os parâmetros da shell (por exemplo, aliases).
Todos esses propósitos não foram identificados como separados até mais tarde. Porque os scripts de perfil podem fazer coisas que só fazem sentido em uma sessão interativa (interação terminal, inicie outros programas), quando invocação de shell remota ( rsh ) foi introduzido, os makes do rsh decidiram não invocar o shell remoto como um shell de login, para que os scripts de perfil não sejam executados. (Algumas versões de rshd
têm uma opção para executar o shell remoto como um shell de login.) Ssh copiou esse comportamento para ser um substituto substituto para o rsh.
Se você deseja ter seus scripts de perfil executados, pode invocá-los explicitamente.
ssh 127.0.0.1 '. /etc/profile; . ~/.profile; ydisplay'
Observe o comando .
para carregar os scripts de perfil dentro do shell: eles são comandos a serem executados dentro daquele shell, não um programa externo.
Se você deseja definir uma variável de ambiente globalmente para todos os usuários, há outro método em muitos sistemas: em vez de defini-la em /etc/profile
, defina-a em /etc/environment
. Este arquivo é lido através do módulo pam_env
; a maioria das distribuições do Linux está configurada para lê-lo.
Se o seu login shell é bash, existe uma outra possibilidade. Normalmente, você não deve definir variáveis de ambiente em .bashrc
(porque elas não serão definidas em sessões X, exceto se você passar por um terminal com um shell interativo, porque elas não serão definidas se você efetuar login interativamente em um console de texto ou por ssh, porque elas substituirão as configurações personalizadas se você invocar um shell dentro de outro programa ). No entanto, o bash tem um recurso estranho que eu nunca entendi: ele lê ~/.bashrc
em duas circunstâncias não relacionadas:
- em shells interativos que não são shells de login;
- em shells não interativos que não são shells de login, se o bash pensar que ele foi chamado por
rshd
ou sshd
.
Quando você executa um comando sobre o ssh, você está no segundo caso. Você pode solicitar que seu perfil seja lido lendo /etc/profile
e .profile
de .bashrc
. Inclua o seguinte código no seu ~/.bashrc
:
case $- in
*i*) :;; # this is an interactive shell, fine
*) # This is not an interactive shell! This must be a non-interactive remote shell session.
. /etc/profile; . ~/.profile
return;;
esac