Normalerweise können wir ~/.bashrc
mit diesem Befehl eine Quelldatei erstellen
source ~/.bashrc
Aber wenn ich dies in ein Shell-Skript schreibe und es ausführe, passiert nichts. Warum?
Gibt es eine Möglichkeit, dies zu tun?
Mein Drehbuch:
#!/bin/bash
chmod a+x ~/.bashrc
source ~/.bashrc
Auch versucht .
(Punkt) statt source
. Gleiches Ergebnis.
source ~/.bashrc
in der Shell ausgeführt werden, deren Umgebung Sie ändern möchten. Sie können es nicht von einem anderen Prozess aus ändern. Möglicherweise kann das Hinzufügen dieses Alias (global) Teil des Installationsprozesses Ihrer GUI sein.Ihr
.bashrc
fängt normalerweise an:Da für Ihr Skript PS1 nicht festgelegt ist (da es nicht interaktiv ist), wird der Pfad nicht zurückgesetzt, da es vorzeitig beendet wird. Ändern Sie zur Demonstration Ihr Skript:
Dadurch können Ihre Skripte jetzt mit dem neuen arbeiten
.bashrc
. Hinweis: Sobald Ihr Skript beendet ist, wird die env auf den Stand vor dem Starten des Skripts gesetzt. Die Änderungen werden beim nächsten Start eines Terminals übernommen.quelle
.bashrc
verwendet Ubuntu eine zuverlässigere Methode, um zu überprüfen, ob die Shell interaktiv ist./etc/bash.bashrc
hat noch den PS1 Test.Versuchen:
Dies sollte ~ / .bashrc, ~ / .bash_aliases usw. neu laden.
quelle
source
, zerstört aber alle Variablen und zwar so, dass der Benutzer sie manuell eingestellt hat - was auch immer Sie wollen oder nicht.exec bash
, wie ich es verstehe, in die gleichen bash-Einstellungen wie zuvor?Ich möchte Ravis Antwort ergänzen :
Dieses Verhalten ist spezifisch für Ubuntu (und wahrscheinlich die meisten abgeleiteten Distributionen), da Ihre Standarddatei
~/.bashrc
mit einem Kurzschluss beginnt, beispielsweise Ubuntu 18.04:Dadurch wird die Auswertung der Datei gestoppt, wenn sie in einer nicht interaktiven Shell ausgeführt wird, wie dies bei Ihrem Skript der Fall ist, da alle Skripts in einer nicht interaktiven Shell ausgeführt werden , und anschließend jede Datei, die Sie
source
diese Eigenschaft erben.eval
hackenIch habe einen hässlichen Hack gefunden, um Ubuntu speziell zu umgehen, indem ich
eval
anstelle vonsource
:Es überspringt einfach die wenigen ersten Zeilen und wertet den Rest aus,
~/.bashrc
so dass der Rest ausgewertet wird und die aktuelle Ausführung ändert.Beachten Sie, dass es sich um eine magische Zahl handelt und möglicherweise nicht für alle Ubuntu-Versionen funktioniert. Dies kann jedoch eine gute Lösung sein, wenn Sie Skripte für mehr oder weniger bekannte Systeme erstellen.
Eine schickere Lösung könnte darin bestehen, Regex zu verwenden, um auf die spezifischen Bits abzuzielen, die die Auswertung stoppen.
Shebang Alternative
Eine andere Alternative, die in einigen Szenarien möglicherweise besser funktioniert, besteht darin, das Skript zur Ausführung in einer interaktiven Shell zu zwingen, indem im shebang ein Flag hinzugefügt wird :
Seien Sie sich einiger Dinge bewusst:
#!/usr/bin/env bash
Formular zu verwenden, aber auf diese Weise können Sie die Shell nicht mit Argumenten starten .-i
hat seine eigenen Konsequenzen, unter anderem werden Programme zur Benutzerinteraktion aufgefordert, und dies ist normalerweise nicht für Skripte gedacht. Wenn Sie beispielsweisedeb
Pakete installieren , wird das Skript möglicherweise bei Eingabeaufforderungendpkg configure
angehalten .set -i
undset +i
zu deaktivieren, wo ich sie brauchte, aber das funktioniert nicht .quelle
Keine der anderen Methoden funktionierte für mich [
source /path/to/file
vs. ./path/to/file
, alias, etc ...], bis ich dank dieses Tutorials Folgendes fand:#!/usr/bin/env bash
shebangAnstelle der einfacheren
#!/usr/bin/env
Methode können Argumente an den Interpreter weitergeleitet werden, der meiner Meinung nach der Schlüssel ist. Weitere Informationen finden Sie in diesem Dokument .In jedem Fall, wenn Quellbefehle in irgendeiner Form für Sie nicht funktionieren, versuchen Sie, Ihren shebang zu überprüfen, das könnte das Problem sein :)
quelle