Rückkehr von emulate bash setzt zsh optts zurück

383
Jounathaen

Ich habe also einige Setup-Skripte am Werk, die nur mit funktionieren bash(weil sie zB ==oder verwenden $BASH_SOURCE).

Es funktioniert, um diese Skripts mit dem emulateBefehl von zsh zu finden :

emulate bash source setupscipt.bash emulate zsh 

Aber dies setzt meine zsh Optionen wie "autocd" (in .zshrc) zurück.

Wie soll ich mit der Emulation von bash beginnen und aufhören, damit meine Wahl so bleibt, wie sie ist?

3

1 Antwort auf die Frage

3
mpy

Zefram hat eine ähnliche Frage auf der zsh-Mailingliste vor über 20 Jahren beantwortet :

Die Lösung ist die Verwendung einer Funktion - nennen wir sie source_bash-, um Ihr Bash-Skript zu erzeugen:

function source_bash { emulate -L bash builtin source "$@" } 

Der Trick ist die Option localoptions, die in der Manpage wie folgt beschrieben wird:

LOCAL_OPTIONS Wenn diese Option am Rückkehrpunkt einer Shell-Funktion festgelegt ist, werden die meisten Optionen (einschließlich dieser), die beim Eintritt in die Funktion gültig waren, wiederhergestellt. Optionen, die nicht wiederhergestellt werden, sind PRIVILEGED und RESTRICTED. Andernfalls werden nur diese Option und die Optionen LOCAL_LOOPS, XTRACE und PRINT_EXIT_VALUE wiederhergestellt. Wenn dies durch eine Shell-Funktion explizit aufgehoben wird, bleiben die anderen am Rückgabepunkt gültigen Optionen erhalten. Eine Shell-Funktion kann sich auch eine bekannte Shell-Konfiguration mit einer Formulierung wie "emulate -L zsh" garantieren. Das -L aktiviert LOCAL_OPTIONS.

Setzen Sie diese Funktion auf Ihre ~/.zshrcund Sie müssen nur noch eine

$ source_bash setupscipt.bash 

wenn nötig.

Cooler Trick, aber nur um sicher zu sein: Umgebungsvariablen, die im Setupscript gesetzt sind, werden dann auch im übergeordneten zsh gesetzt? Jounathaen vor 6 Jahren 0
@Jounathaen: Ja. Die Option "localoptions" stellt nur die zsh _options_ wieder her. Die Umgebung bleibt unverändert. Aber versuchen Sie es bitte, wenn es für Ihr Setup genau so funktioniert, wie Sie es möchten. mpy vor 6 Jahren 2
Wie in der letzten Zeile dieses Manpages erwähnt, kann man die kürzere "emulate -L bash" anstelle von "setopt localoptions" in seiner eigenen Zeile verwenden. :) ZeroKnight vor 6 Jahren 1
@ ZeroKnight: Ja, du hast recht. Ich habe die Funktion entsprechend bearbeitet. mpy vor 6 Jahren 0