Jak ponownie załadować .bashrc bez wylogowania i ponownego zalogowania?

1641

Jeśli wprowadzę zmiany .bashrc, jak mogę je ponownie załadować bez wylogowania i ponownego zalogowania?

Jed Daniels
źródło

Odpowiedzi:

2633

Musisz tylko wpisać polecenie:

source ~/.bashrc

lub możesz użyć krótszej wersji polecenia:

. ~/.bashrc
George Hawkins
źródło
88
Nie jest to dokładnie to samo, co logowanie i wylogowywanie. Załóżmy, że masz następujący wiersz w .bashrc:, export PATH=$PATH:fooa następnie zmienisz go na export PATH=$PATH:bar. Jeśli się zalogujesz i wylogujesz, tylko barbędzie w ŚCIEŻCE, ale jeśli zrobisz to, co sugerujesz, zarówno fooi barbędzie w ŚCIEŻCE. Czy znasz sposób na obejście tego?
HighCommander4 25.04.13
7
@ HighCommander4 - bardzo niezadowalającym sposobem na zrobienie tego, co chcesz, jest wykonanie polecenia „bash -l”, ale w rzeczywistości tworzy to nową podpowłokę i po wylogowaniu powrócisz do otaczającej powłoki, w której „foo” nadal znajduje się w ŚCIEŻCE. Jeśli interesuje Cię ŚCIEŻKA, możesz „rozbroić ŚCIEŻKĘ” i zrekonstruować ją od zera, ale prawdopodobnie łatwiej / bezpieczniej jest zrobić „ŚCIEŻKA = / bin: / usr / bin” przed pozyskaniem swojego .bashrc. Sposób, w jaki zmienna PATH jest budowana przy logowaniu, jest w rzeczywistości dość skomplikowany i obejmuje co najmniej dane wejściowe z loginu (patrz „login man”) i / etc / profile (patrz „man bash”).
George Hawkins
2
@Alex można zautomatyzować, dodając wiersz ~ / .bashrc do ~ / .bash_profile, choć nie wiem, czy to dobra praktyka.
Vivek Gani
4
Poleciłbym również utworzenie aliasu (który można przechowywać w ~ / .bashrc lub ~ / .bash_aliases), który otwiera .bashrc i ładuje go ponownie po wyjściu z edytora. Można to zrobić poprzez połączenie dwóch poleceń alias, na przykład tak jak (jeśli vim jest preferowany edytor, w przeciwnym razie zamienić ją na coś innego) alias editbashrc='vim ~/.bashrc; source ~/.bashrc'. Sprawi to, że edycja będzie znacznie płynniejsza, ponieważ nie musisz myśleć o przeładowaniu, po wykonaniu edycji, jeśli używasz niestandardowego aliasu.
Samuel Lampa
6
Wpłynie to tylko na aktualny terminal.
matepal297
283

Lub możesz użyć:

exec bash

Robi to samo i jest łatwiejsze do zapamiętania (przynajmniej dla mnie).

execPolecenie całkowicie zastępuje proces powłoki poprzez uruchomienie określonego wiersza polecenia. W naszym przykładzie zastępuje on bieżącą powłokę nową instancją bash(zaktualizowanymi plikami konfiguracyjnymi).

WhoSayIn
źródło
13
Czy mógłbyś wyjaśnić różnicę source .bashrcpoleceń i exec bash?
muradin
18
@muradin, sourceto wbudowane polecenie powłoki, które wykonuje zawartość pliku przekazanego jako argument w bieżącej powłoce . W twoim przykładzie wykonuje on plik .bashrc w bieżącej powłoce. A execpolecenie zastępuje powłokę danym programem, w twoim przykładzie zastępuje powłokę bash (ze zaktualizowanymi plikami konfiguracyjnymi)
WhoSayIn
3
W moich hiper-specyficznych okolicznościach to totalnie wstrząsnęło. Mój plik Docker wykonuje skrypt instalacyjny, który modyfikuje plik .bashrc. Potrzebuję tego do ponownego załadowania, ale zamiast . ~/.bashrctego uruchomię się , więc wystąpił błąd, ponieważ go brakuje. nie został znaleziony w powłoce, więc to rozwiązanie również jest dostępne. Próbowałem tego i obraz dokera został zbudowany płynnie! dashbashshoptsource
m59
9
Elegancki, ale „robi to samo” nie jest całkowicie poprawny. source ~/.bashrczachowa całe środowisko powłoki (choć prawdopodobnie zmodyfikowane przez źródło ~/.bashrc), podczas gdy exec bashzachowa tylko zmienne środowiskowe bieżącej powłoki (wszelkie zmiany ad-hoc w bieżącej powłoce pod względem zmiennych powłoki, funkcji, opcji zostaną utracone). W zależności od potrzeb preferowane może być jedno lub drugie podejście.
mklement0
12
@ SEoF, kiedy mówisz „bash inception” i jeśli myślisz to, co myślę, że myślisz, muszę powiedzieć, że się mylisz. W przeciwieństwie do filmu, nie robisz bashu po bashu, kiedy to robisz exec bash. execKomenda zastępuje powłokę z programem, w naszym przypadku bash. Tak więc zawsze istnieje jeden przypadek bash w terminalu.
John Red,
121

Do uzupełnienia i kontrast dwóch najbardziej popularnych odpowiedzi, . ~/.bashrci exec bash:

Oba rozwiązania skutecznie ładują się ponownie ~/.bashrc, ale są różnice:

  • . ~/.bashrclub source ~/.bashrcbędzie zachować aktualny shell :

    • Z wyjątkiem zmian, które przeładunkowych ~/.bashrcw bieżącej powłoki ( sourcing ) sprawia, prąd powłoki i jej stanzachowane , który zawiera zmienne środowiskowe, zmienne powłoki, opcje, funkcje powłoki skorupek i historię poleceń.
  • exec bash, lub, bardziej solidnie, exec "$BASH"[1] , zastąpi bieżącą powłokę nową instancją, a zatem zachowa tylko zmienne środowiskowe bieżącej powłoki (w tym te, które zdefiniowałeś ad-hoc).

    • Innymi słowy: wszelkie zmiany ad-hoc w bieżącej powłoce pod względem zmiennych powłoki, funkcji powłoki, opcji powłoki, historii poleceń są tracone.

W zależności od potrzeb preferowane może być jedno lub drugie podejście.


[1] exec bashteoretycznie mógłby wykonać inny bash plik wykonywalny niż ten, który uruchomił bieżącą powłokę, jeśli zdarzy się, że istnieje w katalogu wymienionym wcześniej w $PATH. Ponieważ zmienna specjalna $BASHzawsze zawiera pełną ścieżkę do pliku wykonywalnego, który uruchomił bieżącą powłokę, exec "$BASH"gwarantuje się użycie tego samego pliku wykonywalnego.
Uwaga re "..."wokół $BASH: double-cytowanie zapewnia, że wartość zmiennej jest używany jak jest, bez interpretacji przez bash; jeśli wartość nie ma osadzonych spacji ani innych metaznaków powłoki (co nie jest prawdopodobne w tym przypadku), nie potrzebujesz ściśle podwójnych cudzysłowów, ale używanie ich jest dobrym nawykiem do tworzenia.

mklement0
źródło
Odpowiedziałeś na moje pytanie, zanim zdążyłem je zadać. To dobrze wiedzieć; Często ustawiam CLASSPATH na jedną sesję.
świnie
Więc nawet jeśli wywołam exec „$ BASH”, to czy zmienne, które ustawiają .bashrc, znajdą się w powłoce, którą otworzę w następnej kolejności (używając tego samego pliku wykonywalnego, co moja bieżąca sesja)?
nitinr708
2
@ nitinr708: Tak, exec $BASHźródło ~/.bashrc, więc zobaczysz zmiany w środowisku powłoki w nowej sesji.
mklement0
@ Gaming32, doceniam pomysł hiperłącza przypisu, ale tak naprawdę nie zadziałał (i w odpowiedzi tak krótkiej, to nie jest aż tak ważne).
mklement0
44

Ktoś edytował moją odpowiedź, aby dodać niepoprawny angielski, ale tutaj był oryginał, który jest gorszy od zaakceptowanej odpowiedzi.

. .bashrc
Randy Proctor
źródło
25
Działa to tylko wtedy, gdy bieżącym katalogiem jest katalog domowy. Działa następujące:. ~ / .bashrc
Brian Showalter
6
Co sprawia, że ​​to działa? Co się właściwie dzieje, gdy robię „.bashrc”? Dzięki!
Jed Daniels,
54
. jest skrótem BASH dla wbudowanego polecenia „source”. Zatem „.bashrc” jest tym samym co „source .bashrc” dla interpretera BASH.
Brian Showalter
7
Fajne. Dzięki. Teraz, gdy nie wiedziałem.
Jed Daniels,
2
Właśnie przesłałem prośbę o edycję, aby ją dodać ~/, ale ponieważ pierwsza odpowiedź pokazuje jedno source ~/.bashrci . ~/.bashrczastanawiam się, czy tę odpowiedź należy po prostu usunąć jako zbędną.
Max Ghenis,
18

W zależności od środowiska wystarczy pisać

bash

może również działać.

James
źródło
15
Spowoduje to jednak wywołanie nowej powłoki w bieżącej, co spowoduje marnowanie zasobów. Lepsze wykorzystanie rozwiązania wykonawczego @ WhoSayln, które zastępuje bieżącą powłokę nowo wywołaną.
Bernhard Wagner,
tak, po prostu użyj źródła. Jest to całkowicie niepotrzebne i denerwujące.
dylnmc,
Oprócz komentarza @ BernhardWagner, tracisz także swoją bieżącą historię
bashów,
To dobre rozwiązanie, w którym dostęp do uprawnień użytkownika jest ograniczony.
Tunde Pizzle
wywołanie podprocesu dodaje warstwę złożoności, która nie ma dodatkowej wartości.
Alan Berezin
18

Dzięki temu nie będziesz musiał nawet wpisywać „source ~ / .bashrc”:

Dołącz swój plik bashrc:

alias rc="vim ~/.bashrc && source ~/.bashrc"

Za każdym razem, gdy chcesz edytować swój bashrc, po prostu uruchom alias „ rc

Roy Lin
źródło
5

W zależności od środowiska możesz dodać skrypty, aby automatycznie ładować plik .bashrc po otwarciu sesji SSH. Niedawno przeprowadziłem migrację na serwer z systemem Ubuntu i tam domyślnie ładowany jest plik .profile, a nie .bashrc lub .bash_profile. Aby uruchomić dowolne skrypty w .bashrc, musiałem uruchamiać się przy source ~/.bashrckażdym otwarciu sesji, co nie pomaga przy uruchamianiu zdalnym.

Aby twój .bashrc ładował się automatycznie podczas otwierania sesji, spróbuj dodać to do .profile:

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Otwórz sesję ponownie i powinna załadować wszystkie ścieżki / skrypty, które masz w .bashrc.

karolus
źródło
Mam to w „.profile”, ale to nie działa - za każdym razem, gdy wychodzę, muszę to robić ręcznie. Jakieś sugestie?
Wayne Smallman
4

Użyłem easyengine do skonfigurowania mojego serwera opartego na chmurze.
Znalazłem mój plik bash na /etc/bash.bashrc.

Tak source /etc/bash.bashrczrobiła dla mnie sztuczka!

aktualizacja

Konfigurując goły serwer (ubuntu 16.04), możesz użyć powyższych informacji, jeśli nie skonfigurowałeś jeszcze nazwy użytkownika i logujesz się przez root.

Najlepiej jest utworzyć użytkownika (z uprawnieniami sudo) i zalogować się jako ta nazwa użytkownika.
Spowoduje to utworzenie katalogu dla ustawień, w tym plików .profile i .bashrc.
https://linuxize.com/post/how-to-create-a-sudo-user-on-ubuntu/

Teraz będziesz edytować i (i „źródłowo”) ~/.bashrcplik.

Na moim serwerze znajdował się on pod /home/your_username/.bashrc
(gdzie your_usernametak naprawdę jest nowa nazwa użytkownika, którą utworzyłeś powyżej i teraz się logujesz)

SherylHohman
źródło
4

exec bash to świetny sposób na ponowne uruchomienie i uruchomienie nowej powłoki w celu zastąpienia bieżącej. aby dodać do odpowiedzi, $ SHELL zwraca bieżącą powłokę, którą jest bash. Korzystając z poniższych, przeładuje bieżącą powłokę, a nie tylko bash.

exec $SHELL -l;

Jimmy MG Lim
źródło
3

Dla mnie to, co działa, gdy zmieniam ŚCIEŻKĘ, to: exec "$BASH" --login

Cecília Assis
źródło
Pytanie jest o przeładowania ~/.bashrc, co --loginbędzie nie (bezpośrednio) przeładowania na poziomie użytkownika, przeładuje ~/.bash_profile(lub ~/.bash_loginlub ~/.profile) zamiast tego.
mklement0
3

rodzaj:

source ~/.bashrc

lub w skrócie:

. ~/.bashrc

jwismar
źródło
1
Ponownie działa tylko wtedy, gdy znajdujesz się w katalogu domowym, a ściślej w katalogu, w którym .bashrcsię znajduje. Bardziej poprawnym sposobem na to, jak powiedziano w zaakceptowanej odpowiedzi, jest source ~/.bashrc.
John Red,
2

używam następującego polecenia na msysgit

. ~/.bashrc

krótsza wersja

source ~/.bashrc
Sojan V Jose
źródło
@jwg zaakceptowana odpowiedź to. .bashrc. będzie działać tylko wtedy, gdy jesteś w katalogu domowym na msysgit.
Sojan V Jose
@jwg ok, cienko wspomniałem, że nie trzeba wpisywać „source ~ / .bashrc” zamiast używać krótszej wersji.
Sojan V Jose
@jwg ok dodałem go jako edytuj do oryginalnej odpowiedzi :)
Sojan V Jose
Dlaczego zbędna odpowiedź @Sojan?
nitinr708
@ nitinr708 2014. ledwo pamiętam: P. oryginalna odpowiedź została później zredagowana.
Sojan V Jose
2

Zakładając interaktywną powłokę, chcesz zachować swoją bieżącą historię poleceń, a także załadować / etc / profile (który ładuje dane środowiska, w tym / etc / bashrc, a na Mac OS X ładuje ścieżki zdefiniowane w /etc/paths.d/ przez path_helper), dołącz historię poleceń i wykonaj bash z opcją login ('-l'):

history -a && exec bash -l
beattidp
źródło
1

To również zadziała.

cd ~
source .bashrc
kirti
źródło
7
Tak, ale zmienia również katalog roboczy na ~, co nie jest potrzebne.
Albin
1
Dziękujemy za utrzymanie kontekstu @Krinkle
nitinr708
Czy konieczne jest określenie ~zmiany katalogu roboczego na katalog osobisty użytkownika?
Kenly,
1

Zauważyłem, że czyste exec bashpolecenie zachowa zmienne środowiskowe, więc musisz użyć, exec -c bashaby uruchomić bash w pustym środowisku.

Na przykład, logujesz się do bash, a export A=1jeśli ty exec bash, to A == 1.

Jeśli ty exec -cl bash, Ajest pusty.

Myślę, że to najlepszy sposób na wykonanie swojej pracy.

Kot pies
źródło
-2

osobiście mam

alias ..='source ~/.bashrc'

w moim bashrc, dzięki czemu mogę po prostu użyć „..”, aby go ponownie załadować.

Flo
źródło
4
Wiele osób używa ..jako aliasu cd .., więc będzie to bardzo mylące.
The Godfather
oprócz nazwy aliasu to dobry pomysł. alias rehash='source ~/.bashrc'to mój wybór.
Frank Nocke,
użyj czegoś takiego jak „_rs”, którego używam jako przeładowania powłoki. właściwie używam _ na początek moich aliasów; który jest podobny do js libs underscorejs lub lodash.
Jimmy MG Lim