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

96

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

Eu pergunto porque parece que ~/.bashrc parece ser bash -only, mas existem outros shells também…

    
por Stefan 13.10.2010 / 11:01

4 respostas

88

O arquivo $HOME/.profile é usado por um número de shells, incluindo bash, sh, dash e possivelmente outros.

Na página do bash man:

When bash is invoked as an interactive login shell, ... it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.

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

    
por 13.10.2010 / 15:43
54

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

Se você efetuar login em um gerenciador de exibição X (xdm, gdm, kdm, ...), se ~/.profile for executado depende de como seu gerenciador de exibição e talvez ambiente de área de trabalho foram configurados por sua distribuição. Se você efetuar login sob uma "sessão personalizada", isso geralmente executará ~/.xsession .

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

Veja também:
Diferença entre .bashrc e .bash_profile
Quais arquivos de configuração deve ser usado para configurar variáveis de ambiente com o bash?
Zsh não acerta ~ /. perfil

    
por 13.10.2010 / 23:21
18

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

  1. bash lê de .bash_profile ou .bashrc
  2. zsh lê de .zprofile e .zshrc
  3. ksh lê de .profile ou $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 arquivo /etc/pam.d relevante (por exemplo, /etc/pam.d/common-session no Debian) e, quando o usuário efetuar login, PAM lerá as variáveis de ambiente de ~/.env .

Observe que pam_env basicamente suporta apenas VAR=value entradas.

Mais informações:

por 03.08.2012 / 01:54
13

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

Em csh você usa setenv no bash você usa export para defini-los.

De qualquer forma, você poderia escrever seu próprio arquivo de configuração e incluí-lo com source nos arquivos de pontos de seus shells.

    
por 13.10.2010 / 11:19