Bash vom Terminal aus neu starten, ohne die Terminal-Anwendung (Mac) neu zu starten?

46

Ich habe mich umgesehen und nach einer Antwort auf diese Frage gebissen, aber ich scheine sie nicht zu finden (was seltsam ist).

Meine Frage ist, gibt es eine einfache Möglichkeit, die Bash-Sitzung innerhalb des Terminals auf dem Mac neu zu starten. Ich möchte nur das gleiche Verhalten, als ob ich die Terminalanwendung geschlossen und erneut gestartet hätte (alle Variablen zurückgesetzt, Quelle von .bash_profile usw.).

Ich weiß, wie man .bash_profile erzeugt, aber das ist nicht das, was ich will. Einer der Gründe, warum ich dies tun möchte, ist, dass ein Plugin für meine Bash-Eingabeaufforderung Code enthält, der verhindert, dass Farben mehrmals geladen werden. Daher werden die Farbvariablen bei der Beschaffung von .bash_profile nicht neu geladen, und ich muss die Terminalanwendung neu starten, damit die Änderungen wirksam werden.

Mattias
quelle

Antworten:

64

exec bash sollte den aktuellen Shell-Prozess durch (eine neue Instanz von) bash ersetzen.

Muzer
quelle
2
Ist bash in der Terminalanwendung eine interaktive Shell und startet diese exec bashnur dann neu? Können Sie auch genau erklären, was der Befehl exec tut und welche Optionen er bietet? Vielen Dank!
Mattias
exec ersetzt den aktuellen Prozess durch einen neuen. Bash hat eine sehr gut geschriebene, aber leider schwer zu durchsuchende Manpage; geben man bash, die letzte Instanz der Zeichenfolge SHELL BUILTIN COMMANDS und dann nach unten scrollen zu exec finden. Kurz gesagt, -cwenn Sie das Flag übergeben, wird es ohne Umgebungsvariablen ausgeführt (die möglicherweise für Ihre Zwecke erforderlich sind, ich weiß nicht), und die anderen Argumente -l und -a sind wahrscheinlich nicht die gewünschten Dinge (sie scheinen historisch zu sein) undurchsichtige und spezifische Merkmale). Sie können exec auch zum Öffnen neuer Dateideskriptoren in der aktuellen Shell verwenden, wenn Sie den Befehl weglassen.
Muzer
Können Sie ein Beispiel für die Verwendung von exec zum Öffnen neuer Dateideskriptoren in der aktuellen Shell zeigen? Und was ist mit meiner Frage zu Interactive / Login Shell? Wird die Shell im Terminal ausgeführt, handelt es sich um eine interaktive Shell, bei der alle exec-Befehle berührt werden. Schließlich empfiehlt die genehmigte Antwort dieser Frage den Befehl exec mit dem Flag -l, aber ich verstehe nicht, was er tut. Tut mir leid, dass ich so viel gefragt habe, ich möchte nur ein Verständnis für die Befehle haben, die ich verwende.
Mattias
1
Entschuldigung, ja. Ich bin mir bei Macs nicht sicher, aber in der Linux-Welt sind Shells, die von einem Grafikterminal ausgeführt werden, (normalerweise) keine Anmeldeshells, und Sie starten nur die interaktive Shell neu und nicht das Terminal selbst oder Ihre Anmeldeshell. -lHier ist ein Argument zum Bashen und lässt es sich einfach wie eine Login-Shell verhalten. Das Öffnen von Dateideskriptoren in der aktuellen Shell hat nichts mit Ihrer Frage zu tun, aber Sie können exec 4<>test.txtzum Beispiel festlegen, dass Dateideskriptor 4 auf test.txt verweist. Dann können Sie in der restlichen Shell die echo test>&4Ausgabe in die Datei test.txt ausführen.
Muzer
1
@Muzer Aus Gründen, denen ich nicht ganz zustimmen kann, hat OSX entschieden, dass GUI-Terminalemulatoren Login-Shells ausführen .
Terdon
1

Die akzeptierte Antwort ist großartig für eine Shell, die bash verwendet. Dies wurde auch vom OP gefragt. Ich verwende jedoch Terminal unter macOS mit einer nicht standardmäßigen Shell (zsh) und das Ausführen des Befehls hat exec bashoffensichtlich nicht den gewünschten Effekt : es startet Bash anstelle meiner Standard-Shell.

Der umgebungsunabhängige Befehl exec $SHELLverwendet also die Umgebungsvariable $SHELL, in der die Standard-Shell für den Benutzer gespeichert ist.

Beachten Sie auch, dass Apple in macOS Catalina bash durch zsh ersetzt, damit das OP entweder ausgeführt werden kann exec zshoder exec $SHELLnach dem Update auf macOS 10.15.

phip
quelle