Jaka jest różnica między .bashrc, .bash_profile i .environment?

130

Przez lata korzystałem z wielu różnych systemów opartych na * nix i wydaje się, że każdy rodzaj Bash, którego używam, ma inny algorytm decydowania, które skrypty startowe mają być uruchomione. Na potrzeby zadań takich jak ustawianie zmiennych środowiskowych i aliasów oraz drukowanie komunikatów startowych (np. MOTD), który skrypt startowy jest do tego odpowiednim miejscem?

Jaka jest różnica między oddanie rzeczy .bashrc, .bash_profilei .environment? Ja również widziałem inne pliki takie jak .login, .bash_logini .profile; czy są one kiedykolwiek istotne? Jakie są różnice w tym, które z nich są uruchamiane podczas fizycznego logowania, zdalnego logowania przez ssh i otwierania nowego okna terminala? Czy są jakieś znaczące różnice między platformami (w tym Mac OS X (i jego Terminal.app) i Cygwin Bash)?

Adam Rosenfield
źródło

Odpowiedzi:

73

Główną różnicą w stosunku do plików konfiguracyjnych powłoki jest to, że niektóre z nich są odczytywane tylko przez powłoki "logowania" (np. Gdy logujesz się z innego hosta lub logujesz się w konsoli tekstowej lokalnego komputera z systemem unix). są to te nazywane, powiedzmy, .loginlub .profilelub .zlogin(w zależności od używanej powłoki).

Następnie masz pliki konfiguracyjne, które są odczytywane przez powłoki "interaktywne" (jak w przypadku, te podłączone do terminala (lub pseudoterminal w przypadku, powiedzmy, emulatora terminala działającego w systemie okienkowym). To są te z nazwami jak .bashrc, .tcshrc, .zshrc, itd.

bashkomplikuje to tym, że .bashrcjest odczytywana tylko przez powłokę, która jest zarówno interaktywna, jak i niezalogowana , więc większość ludzi w końcu mówi im, .bash_profileaby również czytali za .bashrcpomocą czegoś takiego jak

[[ -r ~/.bashrc ]] && . ~/.bashrc

Inne powłoki zachowują się inaczej - np. Z zsh, .zshrcjest zawsze odczytywane jako powłoka interaktywna, niezależnie od tego, czy jest to powłoka logowania, czy nie.

Strona podręcznika bash wyjaśnia okoliczności, w jakich czytany jest każdy plik. Tak, zachowanie jest ogólnie spójne między maszynami.

.profilejest po prostu nazwą pliku skryptu logowania pierwotnie używaną przez /bin/sh. bash, będąc ogólnie kompatybilnym wstecz z /bin/sh, odczyta, .profilejeśli taki istnieje.

Sałata
źródło
48

To proste. Jest to wyjaśnione w man bash:

/bin/bash
       The bash executable
/etc/profile
       The systemwide initialization file, executed for login shells
~/.bash_profile
       The personal initialization file, executed for login shells
~/.bashrc
       The individual per-interactive-shell startup file
~/.bash_logout
       The individual login shell cleanup file, executed when a login shell exits
~/.inputrc
       Individual readline initialization file

Powłoki logowania to te, które są odczytywane przy logowaniu (więc nie są one wykonywane, na przykład, podczas zwykłego uruchamiania xterm). Istnieją inne sposoby logowania. Na przykład za pomocą menedżera wyświetlania X. Te mają inne sposoby odczytywania i eksportowania zmiennych środowiskowych podczas logowania.

Przeczytaj również INVOCATIONrozdział w instrukcji. Mówi: „Poniższe akapity opisują, w jaki sposób bash wykonuje swoje pliki startowe”., myślę, że to trafione :) Wyjaśnia też, czym jest „interaktywna” powłoka.

Bash o tym nie wie .environment. Podejrzewam, że to plik twojej dystrybucji, aby ustawić zmienne środowiskowe niezależne od powłoki, którą sterujesz.

Johannes Schaub - litb
źródło
1
Czy możesz dodać, /etc/bashrcaby wypełnić odpowiedź?
Nemoden
9

Klasycznie ~/.profilejest używany przez Bourne Shell i prawdopodobnie jest obsługiwany przez Bash jako starsza miara. Znowu ~/.logini~/.cshrc były używane przez C Shell - nie jestem pewien, czy Bash w ogóle ich używa.

Zostanie ~/.bash_profileużyty raz, podczas logowania. ~/.bashrcSkrypt jest czytać każdym razem, gdy powłoka jest uruchomiony. Jest to analogiczne do /.cshrcC Shell.

Jedną z konsekwencji jest to, że rzeczy w programie ~/.bashrcpowinny być tak lekkie (minimalne), jak to tylko możliwe, aby zmniejszyć narzut podczas uruchamiania powłoki niezalogowanej.

Uważam, że ~/.environmentplik jest plikiem zgodności dla Korn Shell.

Jonathan Leffler
źródło
7

Znalazłem informacje o .bashrc i .bash_profile tutaj, aby podsumować:

.bash_profile jest wykonywany podczas logowania. Rzeczy, które tam umieścisz, mogą być twoją ŚCIEŻKĄ i innymi ważnymi zmiennymi środowiskowymi.

.bashrc jest używany dla powłok innych niż logowania. Nie jestem pewien, co to oznacza. Wiem, że RedHat wykonuje go za każdym razem, gdy uruchamiasz kolejną powłokę (su dla tego użytkownika lub po prostu ponownie wywołując bash). Możesz chcieć umieścić tam aliasy, ale znowu nie jestem pewien, co to znaczy. Po prostu sam to ignoruję.

.profile jest odpowiednikiem .bash_profile dla katalogu głównego. Myślę, że nazwa została zmieniona, aby pozwolić innym powłokom (csh, sh, tcsh) również jej używać. (nie potrzebujesz go jako użytkownik)

Istnieje również .bash_logout, który jest wykonywany przy, tak, zgadnij ... wylogowaniu. Może zechcesz powstrzymać diamonów, a nawet trochę posprzątać. Możesz tam również dodać „wyczyść”, jeśli chcesz wyczyścić ekran po wylogowaniu.

Również nie jest kompletnym follow up na każdy z plików konfiguracyjnych tutaj

Prawdopodobnie są one nawet zależne od dystrybucji, nie wszystkie dystrybucje decydują się na posiadanie każdej konfiguracji, a niektóre mają nawet więcej. Ale jeśli mają tę samą nazwę, zwykle zawierają tę samą treść.

Filip Ekberg
źródło
4

Według Josha Staigera , Terminal.app w Mac OS X tak naprawdę uruchamia powłokę logowania zamiast powłoki niezalogowanej domyślnie dla każdego nowego okna terminala, wywołując .bash_profile zamiast .bashrc.

On poleca:

W większości przypadków nie chcesz utrzymywać dwóch oddzielnych plików konfiguracyjnych dla powłoki logowania i powłoki niezalogowanej - kiedy ustawisz PATH, chcesz, aby dotyczyła obu. Możesz to naprawić, pobierając .bashrc z pliku .bash_profile, a następnie umieszczając PATH i typowe ustawienia w .bashrc.

Aby to zrobić, dodaj następujące wiersze do .bash_profile:

if [ -f ~/.bashrc ]; then 
    source ~/.bashrc 
fi

Teraz, gdy zalogujesz się do swojego komputera z konsoli, zostanie wywołany plik .bashrc.

Rose Perrone
źródło
2

Dobrym miejscem do obejrzenia jest strona podręcznika użytkownika bash. Oto wersja online. Poszukaj sekcji „INVOCATION”.

PolyThinker
źródło
0

Używałem dystrybucji z rodziny Debian, które wydają się wykonywać .profile, ale nie .bash_profile, podczas gdy pochodne RHEL wykonują się .bash_profilewcześniej .profile.

Wydaje się, że to bałagan, gdy musisz skonfigurować zmienne środowiskowe do pracy w dowolnym systemie operacyjnym Linux.

sejsmika
źródło