O script de inicialização é executado duas vezes no SSH

2

Executando o Ubuntu 12.04.

Eu tenho um script que configura o ambiente, executado por /etc/bash.bashrc . (Pode ser configurado para ser executado por outros perfis de shell, eu não o configurei)

Quando eu Ctr+Alt+T para abrir um terminal, o script é executado uma vez. Mas se eu SSH na minha máquina de outra caixa, o script /etc/bash.bashrc init é executado, mas também é executado novamente , e não sei por que.

Outros usuários experimentam o mesmo 'duplo' inicializar. Não é necessariamente um problema, mas eu gostaria de isolar a questão por razões acadêmicas.

Eu adicionei um eco em /etc/bash.bashrc para informar quando está sendo executado. Eu vejo o eco na primeira vez, mas não na segunda vez, levando-me a acreditar que algo mais está executando o script, eu simplesmente não consigo descobrir o que é. Eu verifiquei ~/.profile , ~/.bashrc e ~/etc/profile

Devo enfatizar que esse comportamento só acontece quando um usuário conecta-se à máquina. Eu sei que há alguma diferença entre shells interativos / login / não-login, mas ainda não estou bem claro sobre o assunto ...

    
por Elijah 30.06.2016 / 22:47

1 resposta

2

Para descobrir o que está chamando esse script de configuração de ambiente, você precisa adicionar comandos de rastreamento nesse script, não no único local em que sabe que é usado.

Não há uma maneira portátil de relatar a pilha de inclusões de script de shell. No bash, você pode ver isso através da variável BASH_SOURCE . O Dash mantém os scripts de origem abertos enquanto os executa, portanto, listar os arquivos abertos deve lhe dar uma boa ideia. Como o bash é o shell interativo padrão e o dash é o shell de script padrão, isso deve cobrir a maioria dos casos.

if [ -n "$BASH_SOURCE" ]; then
  eval 'echo "${BASH_SOURCE[@]}"'
else
  readlink /proc/$$/fd/[4-9] 2>/dev/null
fi

( ${BASH_SOURCE[@]} é protegido por trás de eval porque é um erro de sintaxe em sh.)

Observe que .bashrc ou /etc/bash.bashrc é o local errado para variáveis de ambiente . Ele é executado apenas por instâncias interativas não-login do bash - em particular, ele não é executado para logins SSH. Se /etc/bash.bashrc for executado para um login SSH, isso significa que outro script (normalmente ~/.bash_profile ) o origina. O local certo para variáveis de ambiente específicas do site é um script em /etc/profile.d/ ou entradas extras em /etc/environment .

Em relação a shells de login e shells interativos, consulte Diferença entre o login Shell e Non-Login Shell?

    
por 01.07.2016 / 01:35