Por que meu .bashrc é lido quando executo comandos não interativos sobre o ssh?

4

Anexei cada um dos meus arquivos de configuração do bash ( ~/.bashrc , ~/.bash_profile , ~/.profile ) com echo NAME_OF_FILE , ou seja, recebo '.bashrc' quando obtenho ~/.bashrc .

O que me deixa perplexo é por que recebo e indicação de que ~ / .bashrc é incluído quando executo um comando sobre o ssh. Por exemplo, se eu fizer:

ssh localhost echo hi

Eu obtenho

.bashrc
hi

Por que a obtenção de ~/.bashrc é obtida nesse contexto? NÃO deve ser originado, pois isso deve executar uma sessão bash não-interativa?

De fato, ssh localhost tty me obtém um 'not a tty' (precedido por '.bashrc' indicando que ~/.bashrc obtém origem mesmo assim).

Eu usei grep de todos os meus arquivos de configuração para obter comandos em ~/.bashrc explicitamente, e não há nenhum que os explique.

(Eu tenho apenas tty -s && shopt -q login_shell && [[ -r ~/.bashrc ]] && . ~/.bashrc no meu .bash_profile para que eu receba '.bashrc' mesmo em shells de login interativos, mas isso não explica o problema do ssh - eu posso comentar e ainda obter o mesmo comportamento com os exemplos ssh acima)

Como posso depurar isso?

    
por PSkocik 07.05.2014 / 12:39

1 resposta

6

Da página de manual bash :

Bash attempts to determine when it is being run with its standard input
connected to a a network  con‐nection,  as  if  by  the remote shell daemon,
usually rshd, or the secure shell daemon sshd.  If bash
determines it is being run in this fashion, it reads and executes commands
from  ~/.bashrc,  if  that file  exists and is readable.

Ou seja. ~/.bashrc será executado quando você invocá-lo via ssh , independentemente de você ter um tty ou não.

Se você quiser que o seu .bashrc seja executado somente quando estiver interativo, tente no topo:

# If not running interactively, don't do anything
[[ "$-" != *i* ]] && return

Se isso não funcionar, tente o seguinte:

[ -z "$PS1" ] && return
    
por 07.05.2014 / 14:04