Historicamente, os arquivos de perfil ( /etc/profile
e ~/.profile
) eram chamados quando você fazia login (no console de texto, o que mais?) E serviam a 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 email).
- Execute o programa para a sessão, se diferente do shell (por exemplo, outro shell ou X Window).
- Defina os parâmetros do terminal (por exemplo
stty
).
- Defina os parâmetros do shell (por exemplo, aliases).
Todos esses propósitos não foram identificados como separados até mais tarde. Como os scripts de perfil podem fazer coisas que só fazem sentido em uma sessão interativa (interação do terminal, iniciar outros programas), quando a chamada de shell remoto ( rsh ) foi introduzida, as marcas do rsh decidiram não chamar o shell remoto como um shell de logon, para que os scripts de perfil não sejam executados. (Algumas versões do rshd
têm a opção de executar o shell remoto como um shell de logon.) O Ssh copiou esse comportamento para substituir o rsh.
Se você deseja que seus scripts de perfil sejam executados, é possível 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 desse shell, não um programa externo.
Se você deseja definir uma variável de ambiente globalmente para todos os usuários, existe outro método em muitos sistemas: em vez de defini-lo /etc/profile
, defina-o /etc/environment
. Este arquivo é lido através do pam_env
módulo; a maioria das distribuições Linux é configurada para lê-lo.
Se o seu shell de login for bash, há uma possibilidade adicional. Normalmente, você não deve definir variáveis de ambiente.bashrc
(porque elas não serão definidas nas sessões X, exceto se você passar por um terminal com um shell interativo, porque elas não serão definidas se você efetuar logon interativamente em um console de texto ou por um ssh, porque eles substituirão as configurações personalizadas se você chamar 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 logon, se o bash achar que foi invocado por
rshd
ou sshd
.
Quando você executa um comando sobre ssh, está no segundo caso. Você pode organizar a leitura do seu perfil lendo /etc/profile
e a .profile
partir 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
ydisplay
trabalho? fazssh 127.0.0.1 /usr/app/cpn/bin/ydisplay
o trabalho?