Existe um arquivo equivalente ".bashrc" lido por todos os shells?

105

É ~/.bashrc o único local para especificar variáveis ​​de ambiente específicas do usuário, aliases, modificações na PATHvariável, etc.?

Eu pergunto porque parece que ~/.bashrcparece ser bashapenas, mas existem outras conchas também ...

Stefan
fonte

Respostas:

94

O arquivo $HOME/.profileé usado por vários shells, incluindo bash, sh, dash e possivelmente outros.

Na página do manual do bash:

Quando o bash é chamado como um shell de login interativo, ... ele primeiro lê e executa comandos do arquivo / etc / profile, se esse arquivo existir. Depois de ler esse arquivo, ele procura ~ / .bash_profile, ~ / .bash_login e ~ / .profile, nessa ordem, e lê e executa comandos do primeiro que existe e é legível.

csh e tcsh explicitamente não olham, ~/.profilemas esses shells são meio antiquados.

msw
fonte
7
O Zsh, por padrão, não lê .profile. Por isso, apaguei minha resposta anterior afirmando isso. O Zsh só lê .profile quando é chamado por um link simbólico chamado sh.
Fschmitt 13/10/10
10
O tcsh ainda é popular em alguns ambientes.
Maciej Piechotka 13/10/10
1
fschmitt: obrigado pela correção; fixo. Maciej Piechotka: Não tenho dúvidas de que é verdade; no entanto, também é possível (embora complicado) criar scripts * rc que importam outros scripts rc específicos com base no shell em que estão sendo executados.
msw
1
Para que essa maneira funcione, os usuários precisam garantir que cada shell seja um shell de logon. Por exemplo, no Gnome Terminal, vá para Perfil -> Título e comando e ative Run command as a login shell. Você também precisa remover ~/.bash_profileou torná-lo fonte ~/.profile.
26413 Mikel
@fschmitt Você também pode obter fontes $HOME/.profilede dentro do seu Zsh .zshrc. Eu costumo colocar todas as minhas coisas de shell portáteis .profilee então posso compartilhá-las em qualquer ambiente que eu possa alternar.
Benjamin R
56

~/.profileé o lugar certo para definições de variáveis ​​de ambiente e para programas não gráficos que você deseja executar quando efetuar login (por exemplo ssh-agent, screen -m). Ele é executado pelo seu shell de login se for um shell no estilo Bourne (sh, ksh, bash). O Zsh é executado ~/.zprofilee Csh e tcsh ~/.login.

Se você efetuar logon em um gerenciador de exibição X (xdm, gdm, kdm, ...), a ~/.profileexecução depende de como o gerenciador de exibição e, talvez, o ambiente da área de trabalho foram configurados pela sua distribuição. Se você fizer login em uma "sessão personalizada", isso geralmente é executado ~/.xsession.

~/.bashrcé o lugar certo para configurações específicas do bash, como aliases, funções, opções de shell e prompts. Como o nome indica, é específico ao bash; csh possui ~/.cshrc, ksh possui ~/.kshrce zsh possui <drumroll> ~/.zshrc.

Consulte também:
Diferença entre .bashrc e .bash_profile
Quais arquivos de instalação devem ser usados ​​para configurar variáveis ​​de ambiente com o bash?
Zsh não pressionando ~ / .profile

Gilles
fonte
Não se esqueça que o zsh também possui .zloginalém do .zprofileque é executado depois .zshrc (mas apenas para shells de login). Veja as Perguntas frequentes sobre
Geeb
21

Não há arquivo comum, mas você pode fazer com que cada shell seja lido de um arquivo comum.

  1. bashlê de .bash_profileou.bashrc
  2. zsh.zprofile e .zshrc
  3. kshlê de .profileou$ENV

Então, aqui está o que eu faço:

~/.env

# Put environment variables here, e.g.
PATH=$PATH:$HOME/bin

~/.shrc

test -f "$HOME/.env" && . "$HOME/.env"

# Put interactive shell setup here, e.g.
alias ll='ls -l'
PS1='$PWD$ '
set -o emacs

~/.bashrc

test -f ~/.shrc && source ~/.shrc

# Put any bash-specific settings here, e.g.
HISTFILE=~/.bash_history
shopt -s extglob
IGNOREEOF=yes

~/.zshenv

# Put any zsh-specific settings for non-interactive and interactive sessions, e.g.
setopt braceexpand
setopt promptsubst
setopt shwordsplit

~/.zshrc

test -f ~/.shrc && source ~/.shrc

# Put any zsh-specific interactive settings here, e.g.
HISTFILE=~/.zsh_history
setopt ignoreeof

~/.profile

# Interactive sub-shells source .env, unless this is bash or zsh,
# because they already sourced .env in .bashrc or .zshrc.
if test -z "$BASH_VERSION" -a -z "$ZSH_VERSION" || test -n "$BASH_VERSION" -a \( "${BASH##*/}" = "sh" \)
then
    test -f "$HOME"/.env && . "$HOME"/.env
fi

# The name is confusing, but $ENV is ksh's config file for interactive sessions,
# so it's equivalent to .bashrc or .zshrc.
# Putting this here makes running an interactive ksh from any login shell work.
test -f "$HOME"/.shrc && export ENV="$HOME"/.shrc

# Put any login shell specific commands here, e.g.
ssh-add
stty -ixon

~/.bash_profile

source ~/.bashrc
source ~/.profile

~/.zlogin

# zsh sources .zshrc automatically, only need to source .profile
source ~/.profile

~/.zprofile

(empty)

Se você tiver acesso root ao sistema, outra maneira é configurar pam_env.

Você pode colocar

session optional pam_env.so user_envfile=.env

no /etc/pam.darquivo relevante (por exemplo, /etc/pam.d/common-sessionno Debian) e, quando o usuário efetuar login, PAMlerá as variáveis ​​de ambiente de ~/.env.

Observe que pam_envbasicamente suporta apenas VAR=valueentradas.

Mais informações:

Mikel
fonte
14

Não existe um arquivo de configuração de ambiente para diferentes shells, porque é mesmo específico do shell como eles são definidos.

No csh você usa setenvno bash exportpara defini-los.

De qualquer forma, você pode escrever seu próprio arquivo de configuração e incluí-lo sourcenos arquivos de ponto dos seus shells.

echox
fonte