Wie lade ich .bashrc neu, ohne mich ab- und wieder anzumelden?

1644

Wenn ich Änderungen an vornehme .bashrc, wie kann ich es neu laden, ohne mich ab- und wieder anzumelden?

Jed Daniels
quelle

Antworten:

2638

Sie müssen nur den Befehl eingeben:

source ~/.bashrc

oder Sie können die kürzere Version des Befehls verwenden:

. ~/.bashrc
George Hawkins
quelle
88
Dies ist nicht genau das Gleiche wie An- und Abmelden. Angenommen export PATH=$PATH:foo, Sie hatten die folgende Zeile in .bashrc : , und ändern sie dann in export PATH=$PATH:bar. Wenn Sie sich anmelden und wieder abmelden, befindet sich nur barder Pfad, aber wenn Sie das tun, was Sie vorschlagen, befinden sich beide foound barder Pfad. Kennen Sie einen Weg, dies zu umgehen?
HighCommander4
7
@ HighCommander4 - Eine sehr unbefriedigende Möglichkeit, das zu tun, was Sie wollen, ist "bash -l". Dadurch wird jedoch eine neue Subshell erstellt. Wenn Sie sich abmelden, kehren Sie zur umschließenden Shell zurück, in der sich "foo" noch in PATH befindet. Wenn Sie nur an PATH interessiert sind, können Sie "PATH deaktivieren" und von Grund auf neu rekonstruieren. Wahrscheinlich ist es jedoch einfacher / sicherer, "PATH = / bin: / usr / bin" auszuführen, bevor Sie Ihre .bashrc-Datei beziehen. Wie die PATH-Variable beim Anmelden aufgebaut wird, ist eigentlich recht komplex und beinhaltet zumindest Eingaben vom Login (siehe "man login") und / etc / profile (siehe "man bash").
George Hawkins
2
@Alex Sie können es automatisieren, indem Sie die Zeile ~ / .bashrc in ~ / .bash_profile einfügen, obwohl ich nicht weiß, ob dies eine gute Vorgehensweise ist.
Vivek Gani
4
Ich würde auch empfehlen, einen Alias ​​zu erstellen (den Sie in ~ / .bashrc oder ~ / .bash_aliases speichern können), der .bashrc öffnet und nach dem Beenden des Editors neu lädt. Sie können dies tun, indem Sie beispielsweise zwei Befehle in einem Alias ​​kombinieren (wenn vim Ihr bevorzugter Editor ist, tauschen Sie ihn andernfalls gegen einen anderen aus) : alias editbashrc='vim ~/.bashrc; source ~/.bashrc'. Dies macht die Bearbeitung viel reibungsloser, da Sie nach dem Bearbeiten nicht über das erneute Laden nachdenken müssen, wenn Sie den benutzerdefinierten Alias ​​verwenden.
Samuel Lampa
6
Dies betrifft nur das aktuelle Terminal.
matepal297
284

Oder Sie könnten verwenden:

exec bash

Dies macht das Gleiche und ist leichter zu merken (zumindest für mich).

Der execBefehl ersetzt den Shell-Prozess vollständig, indem die angegebene Befehlszeile ausgeführt wird. In unserem Beispiel wird die aktuelle Shell durch eine neue Instanz von bash(durch die aktualisierten Konfigurationsdateien) ersetzt.

WhoSayIn
quelle
13
Könnten Sie bitte den source .bashrcBefehlsunterschied erklären und exec bash?
Muradin
18
@muradin sourceist ein integrierter Shell-Befehl, der den Inhalt der als Argument übergebenen Datei in der aktuellen Shell ausführt . In Ihrem Beispiel wird die .bashrc-Datei in der aktuellen Shell ausgeführt. Und execBefehl ersetzt die Shell durch ein bestimmtes Programm, in Ihrem Beispiel ersetzt er Ihre Shell durch bash (mit den aktualisierten Konfigurationsdateien)
WhoSayIn
3
Unter meinen hyper-spezifischen Umständen hat dies total gerockt. Meine Docker-Datei führt ein Installationsskript aus, das .bashrc ändert. Ich brauche dann , dass neu zu laden, sondern . ~/.bashrcwird ausgeführt , in dashstatt bash, so dass es ein Fehler , da shoptfehlt. sourcewird nicht aus der Shell gefunden, daher ist diese Lösung ebenfalls nicht verfügbar. Ich habe es versucht und das Docker-Image wurde reibungslos erstellt!
m59
9
Elegant, aber "macht das Gleiche" ist nicht ganz richtig. source ~/.bashrcDie gesamte Shell-Umgebung bleibt erhalten (obwohl dies wahrscheinlich durch die Beschaffung von geändert wurde ~/.bashrc), während exec bashnur die Umgebungsvariablen Ihrer aktuellen Shell erhalten bleiben (alle Ad-hoc-Änderungen an der aktuellen Shell in Bezug auf Shell-Variablen, Funktionen und Optionen gehen verloren). Abhängig von Ihren Anforderungen kann der eine oder andere Ansatz bevorzugt werden.
mklement0
12
@SEoF, wenn Sie "Bash Inception" sagen und wenn Sie denken, was ich denke, dass Sie denken, muss ich sagen, dass Sie falsch liegen. Im Gegensatz zum Film geht man nicht immer wieder von Bash zu Bash, wenn man es wiederholt tut exec bash. Der execBefehl ersetzt die Shell durch das Programm, in unserem Fall bash. Es gibt also immer eine Instanz von Bash im Terminal.
John Red
121

Um die beiden beliebtesten Antworten zu ergänzen und gegenüberzustellen , . ~/.bashrcund exec bash:

Beide Lösungen werden effektiv neu geladen ~/.bashrc, aber es gibt Unterschiede:

  • . ~/.bashrcoder source ~/.bashrcwird erhalten Ihre aktuelle Shell :

    • Mit Ausnahme der Änderungen, die beim erneuten Laden ~/.bashrcin die aktuelle Shell ( Sourcing ) vorgenommen werden, bleiben die aktuelle Shell und ihr Status erhalten , einschließlich Umgebungsvariablen, Shell-Variablen, Shell-Optionen, Shell-Funktionen und Befehlsverlauf.
  • exec bashOder, robuste, exec "$BASH"[1] , wird ersetzen Ihre aktuelle Shell mit einer neuen Instanz und damit nur Ihre aktuellen Shell bewahren Umgebungsvariablen (einschließlich denjenigen , die Sie Ad-hoc definiert haben).

    • Mit anderen Worten: Alle Ad-hoc-Änderungen an der aktuellen Shell in Bezug auf Shell-Variablen, Shell-Funktionen, Shell-Optionen und Befehlsverlauf gehen verloren.

Abhängig von Ihren Anforderungen kann der eine oder andere Ansatz bevorzugt werden.


[1] exec bashkönnte theoretisch eine andere bash ausführbare Datei ausführen als die, mit der die aktuelle Shell gestartet wurde, wenn sie zufällig in einem zuvor im Verzeichnis aufgeführten Verzeichnis vorhanden ist $PATH. Da die spezielle Variable $BASHimmer den vollständigen Pfad der ausführbaren Datei enthält, mit der die aktuelle Shell gestartet wurde, exec "$BASH"wird garantiert dieselbe ausführbare Datei verwendet.
Ein Hinweis re der "..."Umgebung $BASH: double-quoting sichergestellt , dass der Variablenwert verwendet wird , wie sie ist, ohne Interpretation durch Schlag; Wenn der Wert keine eingebetteten Leerzeichen oder andere Shell-Metazeichen enthält (was in diesem Fall nicht wahrscheinlich ist), benötigen Sie keine doppelten Anführungszeichen, aber die Verwendung dieser Anführungszeichen ist eine gute Angewohnheit.

mklement0
quelle
Sie haben meine Frage beantwortet, bevor ich sie stellen konnte. Das ist gut zu wissen; Ich stelle meinen KLASSENPFAD oft für eine einzelne Sitzung ein.
Schweinefisch
Selbst wenn ich exec "$ BASH" aufrufe, werden die Variablen, die .bashrc setzt, in der Shell gefunden, die ich als nächstes öffne (unter Verwendung derselben ausführbaren Datei wie meine aktuelle Sitzung)?
nitinr708
3
@ nitinr708: Ja, exec $BASHwird Quelle ~/.bashrc, so dass Sie seine Änderungen an der Shell-Umgebung in der neuen Sitzung sehen werden.
mklement0
@ Gaming32, ich schätze die Idee einer verlinkten Fußnote, aber sie hat nicht wirklich funktioniert (und in einer so kurzen Antwort wie dieser ist es nicht so wichtig).
mklement0
44

Jemand hat meine Antwort bearbeitet, um falsches Englisch hinzuzufügen, aber hier war das Original, das der akzeptierten Antwort unterlegen ist.

. .bashrc
Randy Proctor
quelle
25
Dies funktioniert nur, wenn Ihr aktuelles Verzeichnis tatsächlich Ihr Ausgangsverzeichnis ist. Folgendes wird funktionieren :. ~ / .bashrc
Brian Showalter
6
Was macht diese Arbeit? Was passiert eigentlich, wenn ich ".bashrc" mache? Vielen Dank!
Jed Daniels
54
. ist eine BASH-Verknüpfung für den integrierten Befehl "source". ".Bashrc" ist also dasselbe wie "source .bashrc" für den BASH-Interpreter.
Brian Showalter
7
Cool. Vielen Dank. Jetzt wo ich es nicht wusste.
Jed Daniels
2
Ich habe gerade bearbeitet Antrag hinzufügen ~/, aber da die Top-Antwort zeigt beide source ~/.bashrcund . ~/.bashrcich frage mich , ob diese Antwort sollte nur als redundante gelöscht werden.
Max Ghenis
18

Abhängig von Ihrer Umgebung tippen Sie einfach

bash

kann auch funktionieren.

James
quelle
15
Dadurch wird jedoch eine neue Shell innerhalb der aktuellen aufgerufen, wodurch Ressourcen verschwendet werden. Bessere Nutzung @ WhoSayln ist exec - Lösung , die ersetzt mit der neu aufgerufen man dem aktuell Shell.
Bernhard Wagner
Ja, benutze einfach die Quelle. Das ist völlig unnötig und nervig.
dylnmc
Zusätzlich zu @ BernhardWagners Kommentar verlieren Sie auch Ihre aktuelle Bash-Geschichte, wenn Sie eine neue Shell
erzeugen
Dies ist eine gute Lösung, bei der der Zugriff auf Benutzerrechte eingeschränkt ist.
Tunde Pizzle
Durch das Aufrufen eines Unterprozesses wird eine Komplexitätsebene hinzugefügt, die keinen zusätzlichen Wert hat.
Alan Berezin
18

Damit müssen Sie nicht einmal "source ~ / .bashrc" eingeben:

Fügen Sie Ihre bashrc-Datei hinzu:

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

Führen Sie jedes Mal, wenn Sie Ihren bashrc bearbeiten möchten, einfach den Alias ​​" rc " aus.

Roy Lin
quelle
5

Abhängig von Ihrer Umgebung möchten Sie möglicherweise Skripts hinzufügen, damit .bashrc beim Öffnen einer SSH-Sitzung automatisch geladen wird. Ich habe kürzlich eine Migration auf einen Server durchgeführt, auf dem Ubuntu ausgeführt wird, und dort wird standardmäßig .profile, nicht .bashrc oder .bash_profile geladen. Um Skripte in .bashrc auszuführen, musste ich source ~/.bashrcjedes Mal ausführen, wenn eine Sitzung geöffnet wurde, was beim Ausführen von Remotebereitstellungen nicht hilfreich ist.

Fügen Sie Folgendes zu .profile hinzu, damit Ihre .bashrc-Datei beim Öffnen einer Sitzung automatisch geladen wird:

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

Öffnen Sie Ihre Sitzung erneut und sie sollte alle Pfade / Skripte laden, die Sie in .bashrc haben.

Karolus
quelle
Ich habe dies in ".profile", aber es funktioniert nicht - jedes Mal, wenn ich beende, muss ich es von Hand tun. Irgendwelche Vorschläge?
Wayne Smallman
4

Ich habe easyengine verwendet, um meinen vultr Cloud-basierten Server einzurichten.
Ich habe meine Bash-Datei bei gefunden /etc/bash.bashrc.

So source /etc/bash.bashrchat den Trick für mich!

aktualisieren

Beim Einrichten eines Bare-Servers (Ubuntu 16.04) können Sie die obigen Informationen verwenden, wenn Sie noch keinen Benutzernamen eingerichtet haben und sich über root anmelden.

Es ist am besten, einen Benutzer (mit Sudo-Berechtigungen) zu erstellen und sich stattdessen als dieser Benutzername anzumelden.
Dadurch wird ein Verzeichnis für Ihre Einstellungen erstellt, einschließlich .profile- und .bashrc-Dateien.
https://linuxize.com/post/how-to-create-a-sudo-user-on-ubuntu/

Jetzt bearbeiten und (und "quellen") Sie die ~/.bashrcDatei.

Auf meinem Server befand sich dieser unter /home/your_username/.bashrc
(wo your_usernameist eigentlich der neue Benutzername, den Sie oben erstellt haben und mit dem Sie sich jetzt anmelden)

SherylHohman
quelle
4

exec bash ist eine großartige Möglichkeit, eine neue Shell erneut auszuführen und zu starten, um die aktuelle zu ersetzen. Nur um die Antwort zu ergänzen, gibt $ SHELL die aktuelle Shell zurück, die bash ist. Wenn Sie Folgendes verwenden, wird die aktuelle Shell neu geladen und nicht nur zum Bash.

exec $SHELL -l;

Jimmy MG Lim
quelle
3

Für mich funktioniert, wenn ich den PFAD ändere: exec "$BASH" --login

Cecília Assis
quelle
Die Frage ist , über Nachladen ~/.bashrc, das --loginwird nicht (direkt) reload; Auf Benutzerebene wird es stattdessen neu geladen ~/.bash_profile(oder ~/.bash_loginoder ~/.profile).
mklement0
3

Art:

source ~/.bashrc

oder in kürzerer Form:

. ~/.bashrc

jwismar
quelle
1
Funktioniert wieder nur, wenn Sie sich im Ausgangsverzeichnis befinden, genauer gesagt in dem Verzeichnis, in dem sich das Verzeichnis .bashrcbefindet. Ein korrekterer Weg, dies zu tun, wie in der akzeptierten Antwort angegeben, ist source ~/.bashrc.
John Red
2

Ich benutze den folgenden Befehl auf msysgit

. ~/.bashrc

kürzere Version von

source ~/.bashrc
Sojan V Jose
quelle
@jwg die akzeptierte Antwort ist. .bashrc. funktioniert nur, wenn Sie sich im Ausgangsverzeichnis von msysgit befinden.
Sojan V Jose
@jwg ok i thin ich habe erwähnt, dass Sie nicht 'source ~ / .bashrc' eingeben müssen, sondern die kürzere Version verwenden.
Sojan V Jose
@jwg okay, ich habe es als Bearbeitung zur ursprünglichen Antwort hinzugefügt :)
Sojan V Jose
Warum die redundante Antwort @Sojan?
nitinr708
@ nitinr708 2014. Ich erinnere mich kaum: P. Die ursprüngliche Antwort wurde später bearbeitet, was ich denke.
Sojan V Jose
2

Angenommen, Sie möchten eine interaktive Shell verwenden und Ihren aktuellen Befehlsverlauf beibehalten sowie / etc / profile laden (das Umgebungsdaten einschließlich / etc / bashrc lädt und unter Mac OS X Pfade lädt, die in /etc/paths.d/ via definiert sind path_helper), hängen Sie Ihren Befehlsverlauf an und führen Sie eine Bash-Ausführung mit der Anmeldeoption ('-l') durch:

history -a && exec bash -l
beattidp
quelle
1

Dies wird auch funktionieren ..

cd ~
source .bashrc
Kirti
quelle
7
Es funktioniert, aber es ändert auch das Arbeitsverzeichnis in ~, was nicht erwünscht ist.
Albin
1
Vielen Dank, dass Sie den Kontext am Leben erhalten haben @Krinkle
nitinr708
Muss angegeben werden ~, dass das Arbeitsverzeichnis in das Benutzerverzeichnis geändert werden soll?
Kenly
1

Ich habe festgestellt, dass der reine exec bashBefehl die Umgebungsvariablen beibehält, sodass Sie exec -c bashbash in einer leeren Umgebung ausführen müssen.

Zum Beispiel melden Sie sich bei einer Bash an, und export A=1wenn Sie exec bashdie A == 1.

Wenn Sie exec -cl bash, Aist leer.

Ich denke, das ist der beste Weg, um Ihren Job zu machen.

Katze Hund
quelle
-2

Ich persönlich habe

alias ..='source ~/.bashrc'

in meinem bashrc, so dass ich es einfach mit ".." neu laden kann.

Flo
quelle
4
Viele Leute verwenden ..als Alias ​​für cd .., daher wird es sehr verwirrend sein.
Der Pate
bis auf den aliasnamen eine gute idee. alias rehash='source ~/.bashrc'ist meine Wahl.
Frank Nocke
benutze etwas wie "_rs", das ich als Reload-Shell benutze. Ich benutze _ so ziemlich für einen Anfang meiner Aliase; Das ist ähnlich wie bei js libs underscorejs oder lodash.
Jimmy MG Lim