Wie kann ich eine neue zsh-Instanz starten, die eine bestimmte Datei bezieht?

1

Ich habe ein Skript /venv/bin/activate, das einige Umgebungsvariablen setzt. Ich suche nach einer Möglichkeit, zsh zu starten, dieses Skript als Quelle zu verwenden und dann mit einer normalen interaktiven Sitzung fortzufahren. Wenn ich diese Sitzung beende, sollte die Sitzung, zu der ich zurückkehre, nichts über die durchgeführten Umgebungsänderungen wissen activate. Wie kann ich zsh so aufrufen?

(Dies ist so ziemlich die gleiche Frage wie diese , außer dass ich zsh anstelle von bash verwende.)

bdesham
quelle
1
Ähnlich: Starten Sie zsh mit einem benutzerdefinierten zshrc . Meine Antwort gibt Ihnen einige Ansätze.
Stéphane Chazelas

Antworten:

1

Verwenden ZDOTDIR

Erstellen Sie ein (möglicherweise temporäres) Verzeichnis, /venv_startupdas beispielsweise zwei Dateien enthält: .zshenv und .zshrc. Die .zshenv-Datei besteht aus

source ~/.zshenv
source /venv/bin/activate

während .zshrc sagt

source ~/.zshrc

Rufen Sie nun zsh über auf

ZDOTDIR=/venv_startup zsh

Dies sagt zsh „statt ausgehend von den .zshenv Sourcing und .zshrc Dateien in $HOME, in die Dateien dieser Namen beziehen /venv_startupstatt.“ Da die Versionen in /venv_startupQuelle diejenigen , in $HOMEwie auch immer, der Nettoeffekt ist , dass die Shell läuft

source /venv/bin/activate

zwischen dem Ausführen Ihres Zshenv und Ihres Zshrc. Danach wird es eine normale interaktive Sitzung sein.

bdesham
quelle
1

Wenn das activateSkript nur Umgebungsvariablen festlegt, können Sie diese in einer Shell lesen und anschließend eine neue interaktive zsh-Instanz ausführen.

sh -c '. /venv/bin/activate; exec zsh -i'

Die Wrapper-Shell shkann durch eine beliebige Shell ersetzt werden, die eine Analyse durchführen kann /venv/bin/activate, auch zshwenn das activateSkript mit ihr kompatibel ist.

Zusätzlich zu Umgebungsvariablen erbt die interaktive zsh-Instanz die Prozess-ID und einige andere Prozesseinstellungen wie Ressourcenlimits ( ulimit …) und ignorierte Signale ( trap '' …). Andererseits bleiben die Einstellungen der Shell selbst nicht erhalten: Shell-Variablen ( var=…falls varnicht exportiert), Shell-Optionen ( set -…oder shopt …), Tastenzuordnungen, Alias ​​und Funktionsdefinitionen usw.

Gilles
quelle
Dies ist eine gute Lösung, solange Sie nicht zur ursprünglichen Shell zurückkehren müssen (und solange die Auswirkungen activatenur in die von Ihnen genannten Kategorien fallen).
6.
@bdesham Ja, ich meinte, dass Sie das als separates Shell-Skript ausführen sollten, aber ich sehe, dass es nicht klar ist, das werde ich klären.
Gilles
Oh, noch besser. Danke fürs klarstellen.
Bdesham