Ich versuche, den Gültigkeitsbereich einer Variablen in einer Shell einzuschließen, ohne dass Kinder ihn in zsh sehen. Zum Beispiel tippe ich dies in .zshrc:
GREP_OPTIONS=--color=always
Aber wenn ich ein Shell-Skript mit folgendem ausführe:
#!/bin/bash
echo $GREP_OPTIONS
Die Ausgabe ist:
--color=always
während ich möchte, dass es null ist (das obige Shell-Skript sollte die Variable GREP_OPTIONS überhaupt nicht sehen).
In Bash kann man sagen : export -n GREP_OPTIONS=--color=always
, was dies verhindern wird. Wie schaffe ich das in zsh?
shell-script
zsh
environment-variables
PonyEars
quelle
quelle
export -n
exportiert einfach eine exportierte Variable.Antworten:
export
in zsh ist eine Abkürzung fürtypeset -gx
, wobei das Attributg
"global" bedeutet (im Gegensatz zu lokal für eine Funktion) und das Attributx
"exportiert" bedeutet (dh in der Umgebung). Somit:Dies funktioniert auch in ksh und bash.
Wenn Sie nie exportieren
GREP_OPTIONS
, müssen Sie es nicht deportieren.Sie können auch die indirekte, tragbare Methode verwenden: Wenn Sie eine Variable deaktivieren, wird sie nicht exportiert. In ksh / bash / zsh funktioniert dies nicht, wenn die Variable schreibgeschützt ist.
quelle
env -u GREP_OPTIONS your-script
bei einigenenv
Implementierungen (beliebige Shell). Oder(unset GREP_OPTIONS; exec your-script)
export_all
(-a
) gesetzt? Aber selbst danntypeset +x GREP_OPTIONS
würde die Variable nicht exportiert. Wenn Sie nicht finden können, was falsch ist, versuchen Sie es mit der binären Suche: Sichern Sie Ihre.zshrc
, entfernen Sie die zweite Hälfte, prüfen Sie, ob das Problem weiterhin besteht, hängen Sie entweder das dritte Quartal an oder reduzieren Sie es auf das erste Quartal und wiederholen Sie den Vorgang.Sie können eine anonyme Funktion verwenden, um einen Bereich für die Variable bereitzustellen. Von
man zshall
:Aber abgesehen davon , dass - wenn Sie nicht mit
export
Ihrem.zshrc
überhaupt, sollte die Variable nur sichtbar, in der aktuellen interaktiven Sitzung, und es soll nicht zu Subshells exportiert werden.Wie Terdon in seinem Kommentar erklärte:
export -n
Inbash
bewirkt nur, dass die Eigenschaft "export" aus der Variablen entfernt wird. Die Verwendung vonexport -n GREP_OPTIONS=--color=always
ist also gleichbedeutend damit, dass export überhaupt nicht verwendet wirdGREP_OPTIONS=--color=always
.Mit anderen Worten, um das gewünschte Verhalten zu erzielen, verwenden Sie es einfach nicht
export
. Stattdessen sollten Sie in Ihrem.zshrc
habenDadurch wird die Variable für alle von Ihnen ausgeführten (interaktiven, nicht angemeldeten) Shells verfügbar, so wie Sie es möchten, sie wird jedoch nicht in untergeordnete Shells exportiert.
quelle