To pytanie ma już odpowiedź tutaj:
- Różnica między .bashrc i .bash_profile 6 odpowiedzi
Jest to kłopotliwe, ale po wielu latach korzystania z systemów POSIX w pełnym wymiarze czasu, nadal mam twardy czas na zastanawianie się, czy personalizacja powłoki powinny iść w .bashrc
, .profile
lub gdzieś indziej. Nie wspominając o niektórych plikach konfiguracyjnych specyficznych dla systemu operacyjnego, takich jak .pam_environment
.
Tak, wiem, jak rozwiązywać problemy z dokumentacją i dowiedzieć się, kiedy każdy plik jest ładowany lub nie. Zastanawiam się, czy ktokolwiek opracował wyczerpujące wytyczne, jak zdecydować, w którym pliku umieścić dany typ dostosowania.
Odpowiedzi:
TL; DR:
~/.bash_profile
powinno być super proste i po prostu ładować.profile
i.bashrc
(w tej kolejności)~/.profile
ma rzeczy NIE związane konkretnie z bash, takie jak zmienne środowiskowe (PATH
i znajomi)~/.bashrc
ma cokolwiek chcesz w interaktywnym wierszu poleceń. Wiersz polecenia,EDITOR
zmienne, aliasy bash na mój użytekKilka innych uwag:
Wszystko, co powinno być dostępne dla aplikacji graficznych LUB dla sh (lub bash wywoływanego jako
sh
) MUSI być w~/.profile
~/.bashrc
nie wolno niczego wyprowadzaćPowinno się tam znaleźć wszystko, co powinno być dostępne tylko do logowania
~/.profile
Upewnij się, że
~/.bash_login
nie istnieje.źródło
~/.profile
to poprawnie ustawić środowisko dla usług takich jak GDM / LightDM / LXDM, które jawnie uruchamiają / bin / sh..bashrc
wyniki to całkiem sporo, czy możesz to skomentować? W szczególności, gdzie powinienem umieścić wyjście z pozdrowieniami?[[ $- == *i* ]]
, tzn. Szukając „i” w$-
zmiennej specjalnej . Oczywiście ma to znaczenie przede wszystkim w systemach, w których bash jest kompilowany do odczytu.bashrc
w trybie nieinteraktywnym. (To znaczy, Debian, ale nie Arch.) Ale to jest częstą przyczyną tajemniczych komunikatów o błędach podczas próby połączenia przy użyciusftp
lubscp
lub podobnych narzędzi..bash_profile
i.profile
. Ale bash czyta tylko pierwszy z trzech. Czyli, jeśli masz.bash_login
, a następnie oba.profile
i.bash_profile
będzie tajemniczo ignorowane.W ciągu ostatnich kilku lat, miałem dużo czasu do stracenia, więc zostały zbadane to na nieco ponad 10 minut. Nie mam pojęcia, czy jest to najlepszy układ, tylko taki, który działa poprawnie w prawie wszystkich przypadkach.
Wymagania:
~/.profile
musi być kompatybilny z dowolnym / bin / sh - dotyczy to bash, dash, ksh, czegokolwiek innego, z czego może skorzystać dystrybucja.Zmienne środowiskowe muszą być umieszczone w pliku odczytywanym zarówno przez loginy konsoli (tj. Powłokę „login”), jak i loginy graficzne (tj. Menedżery wyświetlania, takie jak GDM, LightDM lub LXDM).
Nie ma sensu mieć obu
~/.profile
i~/.bash_profile
. Jeśli tego drugiego brakuje, bash z przyjemnością użyje tego pierwszego, a wszelkie linie specyficzne dla basha mogą być strzeżone za pomocą czeku na$BASH
lub$BASH_VERSION
.Odstęp między
*profile
i*rc
polega na tym, że ten pierwszy służy do powłok logowania, a drugi za każdym razem, gdy otwierasz okno terminala. Jednak bash w trybie „logowania” nie jest źródłem~/.bashrc
, dlatego~/.profile
musi to zrobić ręcznie.Najprostsza konfiguracja będzie:
Niech a
~/.profile
ustawia wszystkie zmienne środowiskowe (oprócz tych specyficznych dla bash), być może drukuje linię lub dwie, a następnie źródła,~/.bashrc
jeśli są uruchamiane przez bash, w przeciwnym razie trzymają się składni kompatybilnej z sh.Niech a
~/.bashrc
wykona konfigurację specyficzną dla powłoki, strzeżoną przez sprawdzenie trybu interaktywnego, aby uniknąć zepsucia rzeczy takich jaksftp
na Debianie (gdzie bash jest kompilowany z opcją ładowania~/.bashrc
nawet dla nieinteraktywnych powłok):Istnieje jednak problem polegający na tym, że niektóre nieinteraktywne polecenia (np.
ssh <host> ls
) Pomijają~/.profile
, ale zmienne środowiskowe byłyby dla nich bardzo przydatne.Niektóre dystrybucje (np. Debian) kompilują swój bash z opcją źródła
~/.bashrc
dla takich nieinteraktywnych loginów. W tym przypadku uważam, że użyteczne jest przeniesienie wszystkich zmiennych środowiskowych (export ...
wierszy) do osobnego pliku~/.environ
, i źródło ich z obu.profile
oraz.bashrc
, ze strażnikiem, aby uniknąć zrobienia tego dwa razy:Niestety w przypadku innych dystrybucji (np. Arch) nie znalazłem bardzo dobrego rozwiązania. Jedną z możliwości jest użycie (domyślnie włączonego) modułu PAM pam_env, wprowadzając następujące elementy
~/.pam_environment
:Potem oczywiście aktualizacja
~/.environ
dounset BASH_ENV
.Wniosek? Muszle to ból. Zmienne środowiskowe są uciążliwe. Opcje czasu kompilacji specyficzne dla dystrybucji są ogromnym bólem w dupie.
źródło
.profile
i.bashrc
od.bash_profile
i utrzymanie.profile
czystości..profile
jest czysty , dzięki.~/.profile
i~/.bash_profile
”: I disdagree. Zobacz odpowiedź Dana, dlaczego..profile
i chronićbash
części specyficzne za pomocą warunkowych.Obejrzyj ten znakomity post na blogu autorstwa ShreevatsaR . Oto wyciąg, ale przejdź do postu na blogu, zawiera wyjaśnienie terminów takich jak „powłoka logowania”, schemat blokowy i podobna tabela dla Zsh.
źródło
/etc/profile
połączenia/etc/bash.bashrc
i~/.profile
połączenia~.bashrc
. Tak skutecznie/etc/bash.bashrc
i~/.bashrc
są również wykonywane dla Logowań interaktywnych./bin/sh
BASH_ENV
). Powiązany akapit strony podręcznika bash można znaleźć, wyszukującIf bash is invoked with the name sh
.Oferuję ci moje „kompleksowe” wytyczne:
.bash_profile
i.profile
załaduj,.bashrc
jeśli istnieje, używając np[ -r $HOME/.bashrc ] && source $HOME/.bashrc
.bashrc
.EDYCJA: Dodano przestraszone cytaty do „kompleksowych” na wypadek, gdyby ktoś miał ochotę w to uwierzyć. ;)
źródło
.bash_profile
i.profile
jest nieco zbędne; potrzebujesz tylko tego drugiego. Musisz jednak uczynić go / bin / sh-proof:if [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fi
ponieważ istnieją programy (mianowicie gdm / lightdm), które ręcznie pobierają plik ze skryptu / bin / sh. Oznacza to również, że utrzymywane środowisko.bashrc
byłoby nieskuteczne. Musiałem -1, ponieważ twoje „kompleksowe” wytyczne nie będą działać na wielu systemach, jak kilkakrotnie się nauczyłem.Zrezygnowałem z prób rozgryzienia tego i stworzyłem jeden skrypt (
~/.shell-setup
), który pozyskuję ze wszystkich pozostałych.To podejście wymaga
~/.shell-setup
dwóch funkcji:# 1 jest dość standardowy, chociaż może nie jest często używany w skryptach powłoki.
# 2 jest trudniejsze. Oto, czego używam w bash:
Niestety nie pamiętam, jak to wymyśliłem ani dlaczego wykrycie interaktywnej powłoki nie było wystarczające.
źródło
Włóż wszystko,
.bashrc
a następnie źródło.bashrc
z.profile
Ze strony podręcznika użytkownika bash (w OS X 10.9):
Powyższy tekst jest powodem, dla którego wszystko jest włożone
.bashrc
. Jednak zachowanie powłoki logowania jest nieco inne. Ponownie, cytując ze strony man:.profile
jest odczytywany dla powłok logowania, ale.bashrc
nie jest. Powielanie wszystkich tych rzeczy.bashrc
jest złe ™, więc musimy je.profile
zdobyć, aby zachowanie pozostało spójne.Jednak nie chcemy pozyskać
.bashrc
od.profile
bezwarunkowo. Dodatkowe informacje można znaleźć w komentarzach i innych odpowiedziach.źródło
.bashrc
z.profile
. Zobacz odpowiedź @ DanRabinowitz.[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrc
byłby słodki oneliner dla.profile
.