Dlaczego .bashrc nie działa automatycznie?


202

W moim .bashrcpliku umieściłem niektóre polecenia aliasu , aby mogły być ładowane za każdym razem, gdy otwieram nowe okno terminala. To się jednak nie zdarza.

Muszę wybrać run script:w Terminalu> Preferencje> „ MyDefaultTheme ”> Wstępny panel powłoki i dodać: source .bashrc && clearaby działał ...

Wydaje się to dziwne, ponieważ wiele samouczków mówi tylko, że wystarczy dodać do .bashrcpliku i wszystko jest w porządku.

Zauważ, że nie uruchamiam się bashpodczas korzystania z terminala, bardziej podoba mi się ten drugi (domyślny) (nie wiem co to jest), ponieważ pokazuje mi, gdzie jestem cały czas, np .:

>>d54c6b47b:~ romeo$

zamiast:

>>bash$

W bash wszystko jest ładowane tak, jak powinno.

Więc moje pytanie brzmi: dlaczego mój .bashrcplik nie ładował się automatycznie i czy musiałem dodawać opcję wywoływania go za każdym razem?

Również niektóre samouczki kazały mi zrobić coś takiego:

$alias la=’ls -la >> ~/.bashrc

który powinien napisać do mnie alias .bashrc, to też nie działa ...

Pamiętaj, że jestem nowicjuszem w systemie UNIX, więc bądź łagodny.



@ boehj dobrze wspomina o „nie ładowaniu .bashrc”, ale o to chodzi.
Jari Keinänen

OK, przepraszam, jeśli coś tu pomieszałem.
boehj

Prawdopodobnie lubisz csh(lub inny wariant) lepiej. Ale powinieneś wiedzieć, że >>bash$można to zmienić :)
vol7ron

Jeśli chcesz, aby polecenia działały w trybie onload , utwórz .profilew swoim katalogu domowym
Kolob Canyon

Odpowiedzi:


94

Po prostu włóż to do swojego .profilepliku z katalogu domowego i powinien on działać przy następnym uruchomieniu nowej powłoki lub po uruchomieniusource ~/.profile

Ten link wyraźnie określa kolejność, w jakiej pliki startowe są odczytywane i ładowane przez powłokę: http://hayne.net/MacDev/Notes/unixFAQ.html#shellStartup


zaakceptowałem ten, ponieważ ma rozwiązanie (i był to pierwszy z dwóch prawie identycznych postów).
romeovs

37
Obniżony głos. Odradzam stosowanie się do tej porady. Problem polega na tym, że Terminal tworzy powłoki logowania, a powłoki logowania Bash uruchamiają tylko skrypt uruchamiania, a nie ~/.bashrc. Jednak rozwiązaniem nie jest po prostu umieszczenie .bashrctreści w pliku startowym logowania, ponieważ te dwa pliki są przeznaczone do przeprowadzenia różnych rodzajów instalacji. Zamiast tego kanoniczną konfiguracją dla Bash jest umieszczenie ~/.bash_profileźródła ~/.bashrcw odpowiednim punkcie skryptu (zwykle na końcu).
Chris Page

Nie widzę innego identycznego postu, który mówi tylko o umieszczeniu w pliku sh
Mark

218

Byłem tam, zrobiłem to. Zrozumiałem, że OS X nie odczytuje .bashrcpliku przy starcie basha. Zamiast tego czyta następujące pliki (w następującej kolejności):

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login
  4. ~/.profile

Zobacz także pouczający i użyteczny komentarz Chrisa Johnsena :

Domyślnie Terminal uruchamia powłokę przez /usr/bin/login, co czyni powłokę powłoką logowania. Na każdej platformie (nie tylko Mac OS X) bash nie używać .bashrcdla powłok zgłoszeniowych (tylko /etc/profilei pierwsza .bash_profile, .bash_login, .profileże istnieje i jest czytelny). Dlatego „wstaw source ~/.bashrcw .bash_profile” to standardowa rada

I zazwyczaj wystarczy umieścić rzeczy, które bym normalnie umieszczone w ~/.bashrcdo ~/.profile- pracował tak daleko jak czar.


38
Domyślnie Terminal uruchamia powłokę przez /usr/bin/login, co czyni powłokę powłoką logowania. Na każdej platformie (nie tylko Mac OS X) bash nie używać .bashrcdla powłok zgłoszeniowych (tylko /etc/profilei pierwsza .bash_profile, .bash_login, .profileże istnieje i jest czytelny). Dlatego „wstaw source ~/.bashrcw .bash_profile” to standardowa rada.
Chris Johnsen

5
Odp. „Zazwyczaj po prostu umieszczam rzeczy, które normalnie umieszczam w ~ / .bashrc w ~ / .profile”: Aby uzyskać maksymalną kompatybilność, zalecamy stosowanie się do rad Chrisa Johnsena i umieszczanie wszystkiego, co chcesz zastosować do powłok niezalogowanych w ~ / .bashrc i dodaj „source ~ / .bashrc” do swojego ~ / .bash_profile, aby uruchomić go dla powłok logowania. W przeciwnym razie nie będzie działać dla podpowłok lub jeśli Terminal zmieni się, aby utworzyć powłoki niezalogowane, lub jeśli kiedykolwiek użyjesz xterm lub innego programu terminalowego, który domyślnie tworzy powłoki niezwiązane z logowaniem, lub jeśli będziesz chciał użyć taka sama konfiguracja w innym systemie operacyjnym.
Chris Page

4
W pokrewnej uwadze, w Mac OS X należy rozważyć uruchomienie ~ / .bashrc / etc / bashrc w celu wykrycia globalnych zachowań. W szczególności w / etc / bashrc znajduje się kod, który aktualizuje katalog roboczy przy każdym pytaniu, co pozwala Terminalowi wyświetlać ikonę proxy, tworzyć nowe terminale w tym samym katalogu i przywracać katalog roboczy dla Wznów i grup okien.
Chris Page

Dla mnie pozyskiwanie .bashrc z .bash_profile nie działało. Ale działało pozyskiwanie .bashrc / .bash_profile z .profile.
Ken Russell

2
Dobra odpowiedź, ale trochę źle poinformowana. Wierzę obciążeń terminali bash tylko jeden z ~/.bash_profile, ~/.profile, ~/.bash_login, nie wszystkie z nich. Możesz uruchomić prosty test, tworząc 3 pliki. To wygląda jak terminal bash ma preferencje ~/.bash_profile> ~/.bash_login> ~/.profile. Jeśli którykolwiek z nich istnieje, te o mniejszej preferencji są pomijane. Dlatego czasami zaleca się również źródło ~/.profilew ~/.bash_profile.
neuryt

25

Wkładam wszystko do ~/.bashrci tylko source ~/.bashrcw .profilu.

Dzięki temu sesje screen i xterm (i chyba tmux) dziedziczą moje środowisko, ponieważ uruchamiane są tylko sesje bez logowania .bashrc, podczas gdy sesje logowania (np. Terminal lub iTerm) są uruchamiane .profile.


1
To jest moje podejście. W ten sposób mogę utrzymać .bashrc, który działa na obu systemach ... i mogę umieścić w moim pliku .bash_profile dowolne specyficzne dla systemu Mac rzeczy lub rzeczy, takie jak aliasy, które są tylko do pracy (gdzie najczęściej używam mac).
Michael Durrant

2
Zauważ, że .profilejest wspólny dla wielu powłok i powinien zawierać tylko kod sh zgodny z POSIX. Jeśli źródło .bashrc, prawdopodobnie zawiera kod specyficzny dla Bash (istnienie .bashrcpliku jest specyficzne dla Bash). Polecam zmienić nazwę .profilena, .bash_profileponieważ używasz go w sposób specyficzny dla Bash. Lub włóż kod ogólny .profilei stwórz .bash_profileźródło .profilei .bashrc.
Chris Page

19

Istnieją dwa scenariusze:

  1. Używasz Linuksa
  2. Używasz Mac OS X

Zarówno dla źródła, które chcesz pobrać ~/.bashrcw swoim profilu, który jest ładowany lub pozyskiwany, gdy uruchamia się powłoka dla twojego terminala.


LINUX

W systemie Linux ~/.profilejest automatycznie źródłem w powłoce podczas uruchamiania. Tak więc, jeśli przejdziesz do terminala i napiszesz cd ~; ls -A, zobaczysz wszystkie swoje pliki i katalogi w katalogu domowym ( /home/usrname/). Powinieneś zobaczyć plik o nazwie .profile. Jest to plik, który jest automatycznie „pozyskiwany” podczas uruchamiania terminalu.

Jeśli chcesz dodać aliasy i funkcje ~/.bashrc(to jest to, co robię), powinieneś (w środku ~/.profiledodać instrukcję if, która sprawdza, czy ~/.bashrcjest niepusty plik, a następnie go źródła.

Aby sprawdzić, czy ~/.profilejuż to robi, wpisz nano ~/.profile. Spowoduje to otwarcie go w edytorze tekstu (możesz użyć gedit, jeśli wiesz, że go masz, lub nawet vim, jeśli wiesz, jak go używać). Możesz otrzymać pusty plik tekstowy (nie powinieneś), ale jeśli to zrobisz, po prostu kontynuuj. Jeśli nie widzisz linię gdziekolwiek , który mówi source ~/.bashrc, a następnie wprowadź poniższe linie gdzieś (umieścić go w odpowiednim miejscu, jak na koniec lub początek i nie w środku if):

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

Sprawdza, czy ~/.bashrcjest niepustym plikiem (z if [ -s ~/.bashrc ]), a jeśli tak, to go pozyskuje. Dość proste. Teraz możesz dodać dowolny poprawny alias, funkcję, zmienną itp ~/.bashrc. Do.


MAC OS X

Domyślnie, źródła Max OS X ~/.bash_profile. Aby móc dodawać ~/.bashrcróżne rzeczy (co znowu robię w OS X), postępuj zgodnie z tą samą procedurą co Linux. W terminalu wpisz cd ~; nano .bash_profile. Sprawdź wiersz, który mówi, source ~/.bashrca jeśli go nie ma, dodaj instrukcję if powyżej ( if [ -s ~/.bashrc ]; then source ~/.bashrc; fi).


UWAGI

Pisząc instrukcję if, pamiętaj, aby pozostawić spacje między zasadniczo wszystkim (na przykład if [ -s ~/.bashrc]; then echo "found"; finie działa, ponieważ nie ma spacji między ~/.bashrci ]- tłumacz będzie myślał, że to jedno słowo).

Jeśli chcesz dowiedzieć się, jak sprawdzić rzeczy w instrukcji if, przejdź do terminalu i wpisz man \[; daje to w zasadzie wyczerpanie instrukcji if. Na przykład if [ -f /path/to/file ]; then echo "it's a file"; else echo "not a file"; fisprawdza, czy /path/to/filejest to plik i czy jest odpowiednio drukowany na standardowe wyjście. Odnoszę się do tego również w celu łatwiejszego spojrzenia i szybkiego zapoznania się: 7.2. Operatorzy testowania plików .

Mam nadzieję, że to pomoże. Pamiętam, jak byłem zdezorientowany, kiedy zacząłem wszystkie te rzeczy (co nie było tak dawno temu); powodzenia w przyszłych przedsięwzięciach UNIX!


W .profilesystemie Linux jest pozyskiwany tylko wtedy, gdy twoja powłoka jest powłoką logowania, w przeciwnym razie .bashrcjest pozyskiwana
smac89

11

Sourcing .profile w .bash_profile zrobił to dla mnie

echo 'source ~/.profile' >> ~/.bash_profile

1
Pozyskiwanie .profile w .bash_profile jest świetną rzeczą do zrobienia, ale samo to nie spowodowałoby uruchamiania .bashrc przez powłoki logowania. Twój .profile musi już mieć .bashrc, co może powodować problemy, jeśli kiedykolwiek użyjesz powłoki innej niż bash. Większość użytkowników komputerów Mac nigdy tego nie zrobi, ale jeśli zrobisz to z jakiegoś powodu, pamiętaj o tym. :)
Terry N

Aby rozwinąć to, co powiedział @TerryN: pamiętaj, aby źródło .bashrcpochodziło z twojego, .bash_profilea nie z .profile. .bash_profilejest specyficzny dla Bash i powinien pozyskać pozostałe dwa.
Chris Page

6

Odkryłem, że po zainstalowaniu rvm (autoinstalator, bez ręcznej edycji) stworzył on ~/.bash_loginplik dla siebie, w którym wcześniej go nie miałem.

Oznacza to jednak, że moje ~/.profileustawienia i aliasy nie są już ładowane! Wiele skrótów zniknęło. Myślałem, że biegną sekwencyjnie, a nie wyłącznie: - /

dodałem

. ~/.profile 

do ~/.bash_loginłączenia rzeczy zgodnie z oczekiwaniami.


+1, mam taką sytuację. Odkryłem, że albo .bash_login albo .bash_profile zapobiegnie wykonaniu .profile ... Nie mam pojęcia, dlaczego bash czuje potrzebę posiadania tak wielu sprzecznych plików startowych.
RichVel

.profilejest wspólny dla kilku różnych powłok i powinien zawierać tylko kod sh zgodny z POSIX. .bash_profilejest specyficzny dla Bash i może zawierać kod specyficzny dla Bash. Ogólnie rzecz biorąc, jeśli używasz Bash, powinieneś, .bash_profilechyba że jesteś ostrożny, aby upewnić się, że twój kod startowy nie zawiera niczego, co zależy od Bash. Jakikolwiek utworzony program .bash_loginprawdopodobnie tak zrobił, ponieważ zawiera kod specyficzny dla Bash, ale powinien był dołączyć kod źródłowy, .profilejeśli istnieje.
Chris Page

3

Umieszczam ...

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function

... w ~/.bashrc, a następnie źródło ~/.bashrcdo mojego ~/.bash_profile nie działało dla zainstalowanego programu Terminal.

Ale potem poszedłem do menu rozwijanego Edycja> Preferencje profilu , zakładka Tytuł i polecenie i wybrałem Uruchom polecenie jako powłokę logowania z sekcji poleceń tej strony.

Po wykonaniu tej czynności uruchomienie nowego terminalu wyświetla pożądany wynik podczas pisania

 type rvm|head -1

tzn. „rvm jest funkcją”. Nie zrobił tego aż zrobiłem tę zmianę, a to jedyna zmiana zrobiłem po .bash_profilei .bashrczmian opisanych w innych odpowiedzi tutaj.


2

Przede wszystkim powiem ci, że ~/.bashrcjest to plik wykonywany za każdym razem, gdy wywoływana jest druga powłoka (na przykład podczas uruchamiania skryptu powłoki) i ~/.profilejest wywoływany przy każdym logowaniu.

Dlatego polecam napisać . ~/.bashrcpolecenie w swoim ~/.profilepliku, a to polecenie uruchomi plik bashrc przy każdym logowaniu.


kiedy .profile zostanie wykonany podczas logowania, automatycznie uruchomi plik .bashrc.
arun rana

więc .bashrc jest wykonywany pośrednio przy każdym logowaniu
arun rana

1
bashrc jest przeznaczony dla powłok niezalogowanych. bash_profile / bash_login / profile / cokolwiek innego jest dla powłok logowania. Jest to źródło ogromnej niezgody, dotyczące tego, co jest i nie jest powłoką logowania (na przykład sesja screen / tmux, terminal w środowisku pulpitu itp.). Niekoniecznie jest to „druga powłoka”. To kwestia wejścia do powłoki.
Jason Salaz

3
Jeśli kiedykolwiek użyjesz powłoki, która nie jest Bash, robienie tego, co opisujesz, może spowodować problemy. .profile dotyczy wszystkich powłok, a .bashrc może zawierać język, którego niektóre inne powłoki nie rozumieją. Zamiast .profile umieść to, co napisałeś w .bash_profile. (Zrób też pierwszą rzeczą .bash_profile jest „source .profile”.)
Terry N

1

Ten sam problem napotkałem po zainstalowaniu rbenv na moim zdalnym serwerze (Digital Ocean) Ubuntu 16.04.

Jakoś to stworzyło ~/.bash_profile. Tak samo ~/.bashrcjest w systemie OS X.

Ubuntu zaczął tylko czytać ~/.bash_profile, ale nie ~/.bashrctak, jak powinien.

Właśnie utworzyłem kopię zapasową danych ~/.bash_profile:

mv ~/.bash_profile ~/.bash_profile.bak

I przemianowano stary ~/.bashrcna~/.bash_profile

mv ~/.bashrc ~/.bash_profile

To zadziałało dla mnie. Po zalogowaniu ssh mam wszystko załadowane ~/.bashrc.


0

Jeśli to może pomóc komukolwiek innemu ...

Upewnij się, że edytujesz odpowiedni .bashrcplik dla odpowiedniego użytkownika. Miałem podobny problem z używaniem Vagrant. Po uruchomieniu vagrant sshmój .bashrcplik nie był uruchomiony. Rozwiązanie było proste, ponieważ myślałem, że włóczęga loguje się z użytkownikiem o imieniu włóczęga i faktycznie loguję się jako inny użytkownik. Więc edytowałem niewłaściwy .bashrcplik. Po edycji poprawnego .bashrcpliku moje aliasy zostały rozpoznane.


-1

Nawiasem mówiąc, jeśli aktywowałeś ZSH, to zastępuje bash!

Więc wszystkie te ~/.bashrcpliki nie są ładowane.

Zamiast tego musisz ustawić swoje aliasy ~/.zshrc.


-2

Aby pozostać przy logowaniu w stylu OSX .profilei wspierać normalne zachowanie bash .bashrc, możesz użyć .bashrcpliku, jeśli przełączysz się między zwykłym nix a OSX, podając symboliczny link do .bashrcpliku o nazwie .bash_profile. Przed wypróbowaniem tego upewnij się, że ten plik już nie istnieje, ale właśnie tak to robię.

ln -s .bashrc .bash_profile

Wykonując to połączenie między 2 różnymi skryptami inicjalizacji powłoki, tracisz niezbędny rozdział funkcji. Pewnego dnia będziesz potrzebować inicjalizacji na poziomie sesji ( .bash_profile) i inicjalizacji innej na każdym poziomie powłoki ( .bashrc).
dan

-2

/ etc / bashrc jest przeznaczony do profili globalnych w systemach Mac. Możesz dodać: alias ls = "ls -G" na początku tego pliku, a twoje dobro, każdy będzie miał pokolorowane pliki i foldery w systemie, więc nie będziesz musiał niczego dodawać dla każdego użytkownika. Zauważysz również wraz z „sudo su -”, aby zrootować z siebie nadal będziesz mieć pokolorowane pliki i foldery bez dodatkowych problemów.

Kolejna fajna wskazówka: w przypadku korzystania z Iterm2 Maca, importowanie profili kolorów spowoduje natychmiastowe renderowanie kolorowania plików i folderów zgodnie ze schematem kolorów po ustawieniu tej opcji „/ etc / bashrc”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.