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.