Dlaczego Mac OS X nie pobiera ~ / .bashrc? [duplikować]

95

To pytanie ma już odpowiedź tutaj:

Znalazłem wiele osób zastanawiających się, dlaczego instrukcje podobne do tego:

Put X to your ~/.bashrc and you can do Y

nie działa

Zawsze okazuje się, że pliki startowe bash Mac OS X (lub sama Bash Maca) nie źródło ~ / .bashrc, ani w powłoce logowania, ani w powłoce spawnowanej z systemu Windows - jak aplikacja Terminal w Mac OS X)

Dlaczego tak jest, skoro zrobiły to wszystkie inne systemy uniksowe z Bash, z którymi wcześniej pracowałem?

PS:

Znalazłem to, co sama Bash mówi o plikach startowych (co może być pomocne):

Gdy Bash jest wywoływany jako interaktywna powłoka logowania lub jako nieinteraktywna powłoka z opcją --login, najpierw czyta i wykonuje polecenia z pliku / etc / profile, jeśli plik ten 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. Opcji --noprofile można użyć, gdy powłoka zostanie uruchomiona w celu zahamowania tego zachowania.

Źródło: http://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files

Paweł Brewczyński
źródło
Zauważyłem również, że ~/.bash_profilejest wykonywany, ale nie ~/.bashrc. Wierd.
igaurav,

Odpowiedzi:

90

W OSX terminal domyślnie rozpoczyna sesję logowania, więc czyta plik .bash_profile itp. (Proces logowania GUI, który pyta o twoje imię i hasło, nie używa skryptów powłoki i nie uruchamia powłoki, wszystko jest wykonywane od uruchomienia i obszaru roboczego)

Na innych Uniksach xterm domyślnie uruchamia powłokę bez logowania, więc czytają .bashrc, ponieważ skrypty, które przedstawiają twoje hasło itp. Podczas logowania, wywołują sesję logowania, a wszystkie terminale są podprocesami tego i dziedziczą środowisko powłoki.

Z dokumentu GNU, o którym wspominałeś

Wywoływany jako interaktywna powłoka niezalogowana

Po uruchomieniu interaktywnej powłoki, która nie jest powłoką logowania, Bash czyta i wykonuje polecenia z ~ / .bashrc, jeśli plik istnieje. Można temu zapobiec, używając opcji --norc. Opcja --rcfile pliku zmusi Bash do odczytu i wykonywania poleceń z pliku zamiast ~ / .bashrc.

Zwykle plik ~ / .bash_profile zawiera wiersz

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

po (lub przed) inicjalizacjach związanych z logowaniem.

użytkownik151019
źródło
7
Unicies = Uniksy?
Paul Brewczynski
8
No cóż, chodziło mi o
jednorożce
8
... i trzecia forma „Unixen” (chociaż wolę Unices)
kamera na uchu
7
i czwarte „Jednorożce” ...
zadzwoń
8
nie zapominajmy o zerowej formie, tj. „eunuchowie”
smatthewenglish 11.01.17
19

bashczyta tylko .bashrcdla non-login muszli:

Po uruchomieniu interaktywnej powłoki, która nie jest powłoką logowania, bash czyta i wykonuje polecenia z ~ / .bashrc, jeśli plik istnieje. Można temu zapobiec, używając opcji --norc. Opcja --rcfile pliku zmusi bash do odczytu i wykonywania poleceń z pliku zamiast ~ / .bashrc.

Ponieważ Terminal zaczyna się bashjako powłoka logowania (uruchom, waby zobaczyć, że bashinstancje są wykonywane jako -bash), .bashrcnigdy nie jest odczytywany automatycznie.

nohillside
źródło
Chodzi o to, że aplikacja Termina na Mac OS X zawsze tworzy instancję „bash” logowania? Dlaczego ? Jeśli naprawdę się nie zalogujesz. (Masz login wcześniej z GUI)
Paul Brewczynski
Dlaczego inne systemy uniksowe czytają ~ / .bashrc?
Paul Brewczynski
3
Nikt tutaj nie jest w stanie wyjaśnić decyzji projektowych podjętych przez Apple. Mógłbym z łatwością dyskutować obie strony, ale to też nie pomaga. Więc po prostu zaakceptuj to, ponieważ jest to prawdopodobnie najlepsza opcja
nohillside
Cóż, to pierwszy raz, kiedy uruchamiasz powłokę tak, aby była to login. W Uniksach opartych na X11 zaczynasz od uruchomienia powłoki, która następnie uruchamia X, więc nie jest to login
151019
@PaulBrewczynski Cóż, Linux ma wywołanie z .bash_profile na .bashrc.
Paul Stelian