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


105

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

Chiedo perché sembra che ~/.bashrcsembra bash-solo, ma esistono anche altre conchiglie ...

Risposte:


94

Il file $HOME/.profileviene 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 login interattiva, ... 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 non guardano esplicitamente ~/.profilema quelle shell sono un po 'antiquate.


7
Zsh di default non legge .profile. Ecco perché ho eliminato la mia risposta precedente affermando questo. Zsh legge .profile solo quando è invocato da un collegamento simbolico chiamato sh.
fschmitt,

10
tcsh è ancora popolare in alcuni ambienti.
Maciej Piechotka,

1
fschmitt: grazie per la correzione; fisso. Maciej Piechotka: Non ho dubbi che sia vero; tuttavia è anche possibile (anche se complicato) creare script * rc che importano particolari altri script rc in base alla shell su cui sono in esecuzione.
msw,

1
Perché questo modo funzioni, gli utenti devono assicurarsi che ogni shell sia una shell di accesso. Ad esempio, in Gnome Terminal, vai su Profilo -> Titolo e comando e abilita Run command as a login shell. È inoltre necessario rimuovere ~/.bash_profileo renderlo fonte ~/.profile.
Mikel,

@fschmitt Puoi anche procurarti $HOME/.profileda dentro la tua Zsh .zshrc. Tendo a mettere tutte le mie cose portatili shell .profilee poi posso condividerle in qualsiasi ambiente tra cui potrei saltare.
Benjamin R

56

~/.profileè il posto giusto per le definizioni di ambiente variabili e per i programmi non grafici che si desidera eseguire quando si accede (ad esempio ssh-agent, screen -m). Viene eseguito dalla shell di login se si tratta di una shell in stile Bourne (sh, ksh, bash). Viene eseguito ~/.zprofileinvece Zsh e Csh e tcsh vengono eseguiti ~/.login.

Se accedi sotto un X display manager (xdm, gdm, kdm, ...), se ~/.profileviene 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", di solito viene eseguita ~/.xsession.

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

Vedi anche:
Differenza tra .bashrc e .bash_profile
Quali file di installazione dovrebbero essere usati per impostare le variabili di ambiente con bash?
Zsh non colpisce ~ / .profile


Non dimenticare zsh ha anche .zloginin aggiunta a .zprofileche corre dopo .zshrc (ma solo per shell di login). Vedi le domande frequenti su ZSH
Accidenti

21

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

  1. bashlegge da .bash_profileo.bashrc
  2. zshlegge da .zprofile e .zshrc
  3. kshlegge da .profileo$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, è possibile configurare un altro modo pam_env.

Puoi mettere

session optional pam_env.so user_envfile=.env

nel /etc/pam.dfile pertinente (ad es. /etc/pam.d/common-sessionsu Debian), e quindi quando l'utente accede, PAMleggerà le variabili d'ambiente da ~/.env.

Si noti che pam_envsostanzialmente supporta solo le VAR=valuevoci.

Ulteriori informazioni:


14

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

In csh si usa setenvin bash si usa exportper definirli.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.