Czy istnieje plik równoważny „.bashrc” odczytywany przez wszystkie powłoki?

105

Czy jest ~/.bashrc to jedyne miejsce do określenia specyficznych dla użytkownika zmiennych środowiskowych, aliasów, modyfikacji PATHzmiennej itp.?

Pytam, bo wydaje się, że ~/.bashrcto bashtylko, ale istnieją też inne powłoki…

Stefan
źródło

Odpowiedzi:

93

Plik $HOME/.profilejest używany przez wiele powłok, w tym bash, sh, dash i ewentualnie inne.

Ze strony podręcznika użytkownika bash:

Gdy bash jest wywoływany jako interaktywna powłoka logowania, ... najpierw czyta i wykonuje polecenia z pliku / etc / profile, jeśli ten plik istnieje. Po odczytaniu tego pliku szuka ~ / .bash_profile, ~ / .bash_login i ~ / .profile, w tej kolejności, i odczytuje i wykonuje polecenia z pierwszego, który istnieje i jest czytelny.

csh i tcsh wyraźnie nie patrzą, ~/.profileale te powłoki są trochę przestarzałe.

msw
źródło
7
Zsh domyślnie nie czyta pliku .profile. Dlatego usunąłem moją poprzednią odpowiedź, stwierdzając to. Zsh czyta .profile tylko wtedy, gdy jest wywoływany przez dowiązanie symboliczne o nazwie sh.
fschmitt
10
tcsh jest nadal popularny w niektórych środowiskach.
Maciej Piechotka,
1
fschmitt: dzięki za korektę; naprawiony. Maciej Piechotka: Nie mam wątpliwości, że to prawda; jednak możliwe jest (choć skomplikowane) tworzenie skryptów * rc, które importują określone inne skrypty rc na podstawie powłoki, w której są uruchomione.
msw
1
Aby ten sposób działał, użytkownicy muszą upewnić się, że każda powłoka jest powłoką logowania. Na przykład w Gnome Terminal przejdź do Profil -> Tytuł i polecenie i włącz Run command as a login shell. Musisz także usunąć ~/.bash_profilelub ustawić go jako źródło ~/.profile.
Mikel
@fschmitt Możesz również pozyskiwać źródła $HOME/.profilez wnętrza swojego Zsh .zshrc. Mam tendencję do umieszczania wszystkich moich przenośnych rzeczy w powłoce, .profilea następnie mogę dzielić się nimi w dowolnym środowisku, w którym mogę wskoczyć.
Benjamin R
56

~/.profilejest właściwym miejscem dla środowiska definicje zmiennych i programów graficznych, które nie mają być uruchamiane podczas logowania (np ssh-agent, screen -m). Jest wykonywany przez powłokę logowania, jeśli jest to powłoka typu Bourne'a (sh, ksh, bash). ~/.zprofileZamiast tego działa Zsh , a Csh i tcsh ~/.login.

Jeśli logujesz się w X menedżerze wyświetlania (xdm, gdm, kdm, ...), to, czy ~/.profilezostanie uruchomione, zależy od tego, jak menedżer wyświetlania i być może środowisko pulpitu zostały skonfigurowane przez twoją dystrybucję. Jeśli logujesz się w ramach „sesji niestandardowej”, zwykle się to wykonuje ~/.xsession.

~/.bashrcjest właściwym miejscem dla ustawień specyficznych dla bash, takich jak aliasy, funkcje, opcje powłoki i monity. Jak sama nazwa wskazuje, jest specyficzna dla bash; csh ma ~/.cshrc, ksh ma ~/.kshrc, a zsh ma <drumroll> ~/.zshrc.

Zobacz także:
Różnica między .bashrc i .bash_profile
Których plików instalacyjnych należy użyć do skonfigurowania zmiennych środowiskowych za pomocą bash?
Zsh nie uderza ~ / .profile

Gilles
źródło
Nie zapominaj, że zsh ma także .zloginoprócz tego, .zprofilektóre działa później .zshrc (ale tylko w przypadku powłok logowania). Zobacz FAQ ZSH
Geeb
21

Nie ma wspólnego pliku, ale możesz sprawić, by każda powłoka odczytała ze wspólnego pliku.

  1. bashczyta z .bash_profilelub.bashrc
  2. zshczyta z .zprofile i .zshrc
  3. kshczyta z .profilelub$ENV

Oto co robię:

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

Jeśli masz dostęp do systemu root, innym sposobem jest skonfigurowanie pam_env.

Możesz włożyć

session optional pam_env.so user_envfile=.env

w odpowiednim /etc/pam.dpliku (np. /etc/pam.d/common-sessionna Debianie), a następnie, gdy użytkownik się zaloguje, PAModczyta zmienne środowiskowe ~/.env.

Pamiętaj, że w pam_envzasadzie obsługuje tylko VAR=valuewpisy.

Więcej informacji:

Mikel
źródło
14

Nie ma czegoś takiego jak plik konfiguracyjny środowiska dla różnych powłok, ponieważ jego powłoka określa sposób ich definiowania.

W csh używasz setenvw bash, którego używasz exportdo ich definiowania.

W każdym razie możesz napisać własny plik konfiguracyjny i dołączyć go sourcedo plików dot. Twoich powłok.

echox
źródło