Gibt es eine ".bashrc" -Äquivalentdatei, die von allen Shells gelesen wird?

105

Ist ~/.bashrc der einzige Ort, an dem benutzerspezifische Umgebungsvariablen, Aliase, Änderungen an PATHVariablen usw. angegeben werden können?

Ich frage, weil es so ~/.bashrcaussieht, als bashob es nur -nur-Muscheln gibt, aber es gibt auch andere Muscheln…

Stefan
quelle

Antworten:

94

Die Datei $HOME/.profilewird von einer Reihe von Shells verwendet, darunter bash, sh, dash und möglicherweise andere.

Von der Bash-Manpage:

Wenn bash als interaktive Anmeldeshell aufgerufen wird, ... liest es zuerst Befehle aus der Datei / etc / profile und führt sie aus, falls diese Datei existiert. Nach dem Lesen dieser Datei sucht sie in dieser Reihenfolge nach ~ / .bash_profile, ~ / .bash_login und ~ / .profile und liest und führt Befehle von der ersten Datei aus, die vorhanden und lesbar ist.

csh und tcsh schauen sich das explizit nicht an, ~/.profileaber diese Muscheln sind irgendwie antiquiert.

msw
quelle
7
Zsh liest standardmäßig nicht .profile. Aus diesem Grund habe ich meine vorherige Antwort gelöscht. Zsh liest .profile nur, wenn es von einem symbolischen Link namens sh aufgerufen wird.
Fschmitt
10
tcsh ist in einigen Umgebungen immer noch beliebt.
Maciej Piechotka
1
fschmitt: danke für die korrektur; Fest. Maciej Piechotka: Ich habe keinen Zweifel, dass das stimmt. Es ist jedoch auch möglich (wenn auch kompliziert), * rc-Skripte zu erstellen, die bestimmte andere rc-Skripte basierend auf der Shell, unter der sie ausgeführt werden, importieren.
msw
1
Damit dies funktioniert, müssen Benutzer sicherstellen, dass jede Shell eine Anmeldeshell ist. Gehen Sie in Gnome Terminal zum Beispiel zu Profil -> Titel und Befehl und aktivieren Sie Run command as a login shell. Sie müssen es auch entfernen ~/.bash_profileoder als Quelle festlegen ~/.profile.
Mikel
@fschmitt Du kannst auch $HOME/.profileaus deinem Zsh heraus schöpfen .zshrc. Ich neige dazu, alle meine tragbaren Shell-Dinge unterzubringen, .profileund dann kann ich sie in jeder Umgebung teilen, zwischen denen ich vielleicht hüpfen möchte.
Benjamin R
56

~/.profileist der richtige Ort für die Umgebungsvariable Definitionen und für nicht-grafische Programme , die Sie , wenn Sie sich in (zB ausgeführt werden sollen ssh-agent, screen -m). Es wird von Ihrer Login-Shell ausgeführt, wenn es sich um eine Bourne-Shell handelt (sh, ksh, bash). Zsh wird ~/.zprofilestattdessen ausgeführt und Csh und tcsh werden ausgeführt ~/.login.

Wenn Sie sich unter einem X-Display-Manager anmelden (xdm, gdm, kdm, ...), ~/.profilehängt die Ausführung davon ab, wie Ihr Display-Manager und möglicherweise die Desktop-Umgebung von Ihrer Distribution konfiguriert wurden. Wenn Sie sich unter einer "benutzerdefinierten Sitzung" anmelden, wird diese normalerweise ausgeführt ~/.xsession.

~/.bashrcist der richtige Ort für bash-spezifische Einstellungen wie Aliase, Funktionen, Shell-Optionen und Eingabeaufforderungen. Wie der Name schon sagt, ist es spezifisch für bash. csh hat ~/.cshrc, ksh hat ~/.kshrcund zsh hat <drumroll> ~/.zshrc.

Siehe auch:
Unterschied zwischen .bashrc und .bash_profile
Welche Setup-Dateien sollten zum Einrichten von Umgebungsvariablen mit bash verwendet werden?
Zsh trifft nicht ~ / .profile

Gilles
quelle
Vergessen Sie nicht , zsh hat auch .zloginzusätzlich zu .zprofileder läuft nach .zshrc (aber nur für Login - Shells). Siehe die ZSH FAQ
Geeb
21

Es gibt keine gemeinsame Datei, aber Sie können jede Shell aus einer gemeinsamen Datei lesen lassen.

  1. bashliest aus .bash_profileoder.bashrc
  2. zshliest aus .zprofile und .zshrc
  3. kshliest aus .profileoder$ENV

Also hier ist was ich tue:

~/.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)

Wenn Sie Root-Zugriff auf das System haben, können Sie es auch einrichten pam_env.

Du kannst Geben

session optional pam_env.so user_envfile=.env

in der entsprechenden /etc/pam.dDatei (zB /etc/pam.d/common-sessionunter Debian) und dann, wenn sich der Benutzer anmeldet, PAMwerden Umgebungsvariablen von gelesen ~/.env.

Beachten Sie, dass pam_envgrundsätzlich nur VAR=valueEinträge unterstützt werden .

Mehr Info:

Mikel
quelle
14

Es gibt keine Umgebungskonfigurationsdatei für verschiedene Shells, da die Definition der Shells sogar spezifisch ist.

In csh verwenden Sie setenvin bash export, um sie zu definieren.

Wie auch immer, Sie könnten Ihre eigene Konfigurationsdatei schreiben und diese sourcein die Punktedateien Ihrer Shells aufnehmen.

Echox
quelle