it-swarm.it

Esiste un file equivalente ".bashrc" letto da tutte le shell?

È ~/.bashrc l'unico posto in cui specificare variabili di ambiente specifiche dell'utente, alias, modifiche alla variabile PATH, ecc?

Chiedo perché sembra che ~/.bashrc sembra essere solo bash, ma esistono anche altre shell ...

115
Stefan

Il file $HOME/.profile è utilizzato da un numero di shell, tra cui bash, sh, dash e possibilmente altre.

Dalla pagina man di bash:

Quando bash viene invocato come Shell di accesso interattivo, ... prima legge ed esegue i comandi dal file/etc/profile, se quel file esiste. Dopo aver letto quel file, cerca ~/.bash_profile, ~/.bash_login e ~/.profile, in quell'ordine, e legge ed esegue i comandi dal primo che esiste ed è leggibile.

csh e tcsh esplicitamente non guardano ~/.profile ma quelle conchiglie sono un po 'antiquate.

97
msw

~/.profile è il posto giusto per le definizioni delle variabili di ambiente e per i programmi non grafici che desideri eseguire al momento dell'accesso (ad esempio ssh-agent, screen -m). Viene eseguito dalla shell di accesso se si tratta di una shell in stile Bourne (sh, ksh, bash). Zsh corre ~/.zprofile invece, e Csh e tcsh eseguono ~/.login.

Se accedi con un display manager X (xdm, gdm, kdm, ...), sia ~/.profile viene eseguito dipende da come il tuo display manager e forse l'ambiente desktop sono stati configurati dalla tua distribuzione. Se accedi in una "sessione personalizzata", che di solito esegue ~/.xsession.

~/.bashrc è il posto giusto per impostazioni specifiche di bash, come alias, funzioni, opzioni Shell e prompt. Come indica il nome, è specifico per bash; csh ha ~/.cshrc, ksh ha ~/.kshrc e zsh ha <drumroll> ~/.zshrc.

Guarda anche:

Non esiste un file comune, ma è possibile leggere ogni Shell da un file comune.

  1. bash legge da .bash_profile o .bashrc
  2. zsh legge da .zprofile e.zshrc
  3. ksh legge da .profile o $ENV

Quindi ecco cosa faccio:

~/.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 si dispone dell'accesso root al sistema, un altro modo è quello di impostare pam_env.

Puoi mettere

session optional pam_env.so user_envfile=.env

nel relativo file /etc/pam.d (ad es. /etc/pam.d/common-session su Debian), e quindi quando l'utente accede, PAM leggerà le variabili di ambiente da ~/.env.

Nota che pam_env Supporta sostanzialmente solo le voci VAR=value.

Ulteriori informazioni:

23
Mikel

Non esiste un file di configurazione di ambiente per shell diverse, perché è anche Shell specifico come sono definite.

In csh usi setenv in bash usi export per definirli.

Ad ogni modo potresti scrivere il tuo file di configurazione e includerlo con source nei dotfile delle tue shell.

15
echox