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

245

Aby utworzyć alias dla terminala w systemie OS X, możesz umieścić aliasy w .bash_profilelub .bashrc. Jaka jest różnica między nimi i dlaczego miałbym wybierać aliasy w jednym, a nie w drugim?

daviesgeek
źródło
5
Nie zniechęcaj tutaj do uniksowej wiedzy, ale bash jest czystą bestią UNIX, więc możesz uzyskać lepszą wiedzę lub uzyskać kilka odpowiedzi na to pytanie w witrynie partnera. Istnieje ponad 200 par bashrc pytanie / odpowiedź na na UNIX
bmike
Istnieje również .profile ... Zobacz to pytanie na temat przepełnienia stosu.
Yaakov Baruch
2
Jeśli brew install bashkorzystasz z iTerm2, możesz ustawić, profile -> commanddo /usr/local/bin/bashktórego .bashrcdomyślnie ładuje się później .bash_profile. To daje ci także Bash 4 gadżety ...
Ray Foss
Słyszałem, że .bashrc nie był używany przez lata i domyślnie nie działa, a .bash_profile jest rzeczą w Macosx. Próbowałem .bashrc
it

Odpowiedzi:

247

.bash_profilejest wykonywany dla powłok logowania, podczas gdy .bashrcjest wykonywany dla interaktywnych powłok bez logowania.

Podczas logowania (wpisz nazwę użytkownika i hasło) przez konsolę, albo siedząc przy komputerze, albo zdalnie przez ssh: .bash_profilewykonywane jest skonfigurowanie powłoki przed pierwszym wierszem poleceń.

Ale jeśli już zalogowałeś się do komputera i otworzyłeś nowe okno terminala (xterm), to .bashrczostanie ono wykonane przed wierszem polecenia okna. .bashrcjest również uruchamiany po uruchomieniu nowej instancji bash przez wpisanie /bin/bashterminala.

W systemie OS X Terminal domyślnie uruchamia powłokę logowania za każdym razem, więc różni się to nieco od większości innych systemów, ale można to skonfigurować w preferencjach.

Alex
źródło
57
On OS X, Terminal by default runs a login shell every time- Zawsze byłem tak zdezorientowany, że nie zdawałem sobie z tego sprawy. Świetna informacja!
vaughan
1
@Alex, Dlaczego terminal OS X uruchamia powłokę logowania za każdym razem?
Pacerier
17
Ponieważ niektórzy deweloperzy Apple nie zdawali sobie sprawy z różnicy, a teraz jest zapisana w mumbo jumbo.
Snowcrash
2
Jestem na OS X i używam zshell zamiast bash i iTerm zamiast Terminal. Pomimo faktu, że używam innego terminala i innej powłoki niż omówiono w odpowiedzi, OS X nadal wydaje się rozważać wszystko jako powłokę logowania, ponieważ .zprofileuruchamia się za każdym razem.
Adam Zerner,
1
Dla tych, którzy szukają dokładnego wyjaśnienia kombinacji login / non-login i interaktywnych / nieinteraktywnych powłok oraz kiedy uruchamiają te pliki konfiguracyjne, zobacz unix.stackexchange.com/a/46856/38715
kevinmicke
45

X11 będzie patrzeć na ciebie, .bashrcpodczas gdy będzie wyglądał „zwykły” terminal.bash_profile

Jeśli jednak dodasz następujące elementy .bash_profile, możesz przenieść wszystko do .bashrcpliku, aby skonsolidować wszystko w jednym miejscu zamiast dwóch:

if [ -f $HOME/.bashrc ]; then
        source $HOME/.bashrc
fi
Przechył
źródło
Lub możesz po prostu zrobić cd ~ ; ln -s .bashrc .bash_profile.
lhf
5
Te 2 pliki konfiguracyjne mają wyraźnie oddzielną funkcję. W niektórych przypadkach konieczne jest posiadanie rzeczy do zainicjowania na początku sesji i tylko tam ( ~/.bash_profile). Często konieczne jest także definiowanie przyrostowe na każdym poziomie powłoki ( ~/.bashrc). Nie jest najlepszym pomysłem, aby tłumić tę wolność.
dan
3
@ Daniel Daniel: Lurch pominął tę część, ale źródła Terminal OS X ~/.bash_profiledla każdego nowego okna / karty, więc tak naprawdę nie ma sposobu na rozdzielenie tych dwóch, jeśli chodzi o Terminal.
mipadi
14
@mipadi Nadal istnieje wartość, aby je rozdzielić. Na przykład, .bash_profilenigdy nie można ponownie uzyskać w procesie potomnym. Każdy poziom zagnieżdżonych źródeł Bash .bashrc, więc jeśli umieścić coś export A=a:$Aw .bashrc, twój $Adostanie już w pod-Basha. Zazwyczaj zostawiam zmienne środowiskowe w profilu, a aliasy w RC.
Franklin Yu,
@FranklinYu Może to nie być wielka sprawa dla wielu ludzi, ale całkowicie się zgadzam! To świetny techniczny punkt, aby przypominać ludziom i zasługuje na znacznie więcej pozytywnych opinii.
Subfuzion,
24

W przypadku systemu macOS kod, który należy umieścić, .bash_profileaby skonsolidować wszystko, .bashrcjest następujący:

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

Jest to bardziej szczegółowe dla użytkownika terminala Mac.

Frzhen
źródło
6
Choć prawda, czym różni się od odpowiedzi Lurcha z 2012 roku ?
Arjan
0

TLDR; użyj .bash_profiledo swoich aliasów.

Sposób, w jaki różne pliki inicjujące współpracują ze sobą, jest nieco bardziej skomplikowany i istnieją pewne ważne specjalne przypadki w OSX. Oto najważniejsze informacje:

  • Bash na dowolnej platformie wykonuje jeden z kilku różnych plików w zależności od tego, w jaki sposób jest wywoływany. Szczegóły są tutaj .
  • Aplikacja terminalowa OSX robi coś niestandardowego: tworzy każdą nową kartę lub okno tak, jakby była powłoką logowania, co oznacza, że .bash_profilejest wywoływana. Zatem powyższa rada TLDR.
  • .bashrcjest również opcją, ale będzie wywoływana za każdym razem, gdy utworzysz podpowłokę (tj. wywołaj bash), co może spowodować nieefektywność, jeśli zaktualizujesz zmienną w niej (np. PATH=/bin/foo:$PATH)
  • Inne aplikacje, które mają osadzone terminale, mogą stosować się do konwencji aplikacji Terminal lub nie. W szczególności Visual Studio Code domyślnie nie .
  • Aplikacje wywoływane za pomocą GUI nie są odradzane z powłoki. Tak więc istnieje kilka konkurujących ze sobą mechanizmów ustawiania zmiennych środowiskowych, które można zobaczyć, które zmieniły się na przestrzeni lat .
  • Fragmenty, które wymagają .bashrcod .bash_profilesą dość powszechne. Nie polecam tego, ale jest to preferencja.
Lew
źródło
Dlaczego używanie .bash_profilealiasów jest skomplikowane? Pozycje, które wymieniasz tylko częściowo, w ogóle dotyczą aliasów, więc zamiast tylko wypunktować niektóre pociski, które mogłyby wyjaśnić, dlaczego wydaje się to skomplikowane, czy możesz zaproponować sposób, aby ułatwić to w tych ograniczeniach?
nohillside
Rozumiem co masz na myśli. Nie jest tak, że korzystanie z .bash_profile jest skomplikowane. Problem polega na tym, że wywoływanie plików jest skomplikowane. Zaktualizuję.
Lew
Wywołanie .bashrc z .bash_profile jest zalecane w podręczniku GNU bash - w przeciwnym razie jak ustawić zmienne itp., Które są potrzebne zarówno w powłokach logowania, jak i nieinteraktywnych?
Mark
Każdy emulator terminala, którego używam na różnych systemach operacyjnych, ma opcję uruchamiania nowych okien jako powłoki logowania, xterm i Xfce, aby wymienić tylko dwa.
fd0