O Bash lê .profile * quando é executado como um shell de login interativo. Quando um comando é dado para execução, ou ao executar um script, ele não é interativo, a menos que você forneça a opção -i e não-login, a menos que você forneça a opção -l , etc. executando comandos via SSH.
O Bash lê .bashrc quando executado de forma não interativa pelo SSH. No entanto, o .bashrc padrão inclui uma verificação para uso interativo:
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Portanto, nenhuma variável definida em .profile ou .bashrc está disponível quando você executa ssh foo some-command . Você pode colocar as variáveis em .bashrc antes da verificação da execução interativa. Por exemplo:
$ head ~/.bashrc
echo foo
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
$ ssh localhost env
foo
LC_MEASUREMENT=en_GB.UTF-8
SSH_CONNECTION=127.0.0.1 46916 127.0.0.1 22
LC_PAPER=en_GB.UTF-8
LC_MONETARY=en_GB.UTF-8
LANG=en_GB.UTF-8
LC_NAME=en_GB.UTF-8
XDG_SESSION_ID=155
USER=muru
...
O echo foo foi executado. Se eu tivesse export foo=bar , então foo teria aparecido na saída env .
* com advertências adequadas sobre a presença de arquivos como .bash_profile , etc.