Angenommen, ich habe eine Variable exportiert:
foo=bar
export foo
Jetzt möchte ich den Export aufheben. Das heißt, wenn ich es tue, sh -c 'echo "$foo"'
sollte ich es nicht bekommen bar
. foo
sollte überhaupt nicht in sh -c
der Umgebung auftauchen .
sh -c
ist nur ein Beispiel, eine einfache Möglichkeit, das Vorhandensein einer Variablen anzuzeigen. Der Befehl kann alles sein - es kann etwas sein, dessen Verhalten einfach durch das Vorhandensein der Variablen in ihrer Umgebung beeinflusst wird.
Ich kann:
unset
die Variable und verlieren sie- Entfernen Sie es mit
env
jedem Befehl:env -u foo sh -c 'echo "$foo"'
- unpraktisch, wenn Sie die aktuelle Shell noch eine Weile verwenden möchten.
Im Idealfall möchte ich den Wert der Variablen beibehalten, aber nicht in einem untergeordneten Prozess anzeigen lassen, auch nicht als leere Variable.
Ich denke ich könnte tun:
otherfoo="$foo"; unset foo; foo="$otherfoo"; unset otherfoo
Dies kann zu Stampfen führen otherfoo
, falls es bereits vorhanden ist.
Ist das der einzige Weg? Gibt es Standardmethoden?
mktemp
wenn das tragbare genug ist, und unset den Wert und Quelle die temporäre Datei die Variable zuzuweisen. Im Gegensatz zu einer Shell-Variablen kann zumindest eine temporäre Datei mit einem mehr oder weniger beliebigen Namen erstellt werden.sh -c
Befehl ist nur ein Beispiel. Nehmen Sie einen Befehl an, innerhalb dessen Sie eine Variable nicht deaktivieren können, wenn Sie so wollen.Antworten:
Es gibt keinen Standardweg.
Sie können die Verwendung einer temporären Variablen mithilfe einer Funktion vermeiden. Die folgende Funktion sorgt dafür, dass nicht gesetzte Variablen nicht gesetzt und leere Variablen leer bleiben. Es werden jedoch keine Funktionen unterstützt, die in einigen Shells enthalten sind, z. B. schreibgeschützte oder typisierte Variablen.
In ksh, bash und zsh können Sie eine Variable mit nicht exportieren
typeset +x foo
. Dadurch bleiben spezielle Eigenschaften wie Typen erhalten, daher ist es vorzuziehen, sie zu verwenden. Ich denke, dass alle Muscheln, die einentypeset
eingebauten habentypeset +x
.quelle
${var+foo}
, wird ausgewertet,foo
obvar
gesetzt ist, auch wenn es leer ist, und nichts anderes.typeset +x
vsexport -n
für die Muscheln, die die ersteren unterstützen? Istexport -n
seltener oder bewahrt es einige Eigenschaften nicht?export -n
odertypeset +x
gleichgültig. In ksh oder zsh gibt es nurtypeset +x
.EDIT: Für
bash
nur, wie in den Kommentaren darauf hingewiesen:Die
-n
Option zumexport
Entfernen derexport
Eigenschaft aus jedem angegebenen Namen. (Siehehelp export
.)Also für
bash
, ist der Befehl , den Sie wünschen:export -n foo
quelle
Ich habe eine ähnliche POSIX-Funktion geschrieben, aber dies riskiert keine willkürliche Codeausführung:
Es werden auch so viele Argumente verarbeitet, wie Sie möchten. Wenn ein Argument ein gültiger Name ist, der nicht bereits festgelegt wurde, wird es stillschweigend ignoriert. Wenn ein Argument ein falscher Name ist, schreibt es in stderr und hält entsprechend an, obwohl jeder gültige Name, der in der Befehlszeile vor einem ungültigen Namen steht, weiterhin verarbeitet wird.
Ich dachte an einen anderen Weg. Ich mag es viel besser.
Nun, beide verwenden viele der gleichen Techniken. Wenn eine Shell-Variable nicht gesetzt ist, wird ein Verweis darauf nicht mit einer
+
Parametererweiterung erweitert. Wenn es jedoch - unabhängig von seinem Wert - festgelegt ist, wird eine Parametererweiterung wie:${parameter+word}
aufword
- und nicht auf den Wert der Variablen erweitert. Und so testen sich Shell-Variablen beim Erfolg selbst und ersetzen sie selbst.Sie können auch selbst versagen . Wenn in der obersten Funktion ein falscher Name gefunden wird, gehe ich
$1
zu null$2
und lasse$1
null, da das nächste, was ich mache, entwederreturn
Erfolg ist, wenn alle Argumente verarbeitet wurden und die Schleife beendet ist, oder wenn das Argument ungültig war, wird die Shell dies tun Erweitern Sie das,$2
in$1:?
das eine Skript-Shell beendet wird, und geben Sie beim Schreibenword
an stderr einen Interrupt an einen interaktiven zurück .Im zweiten
getopts
erledigt man die Aufgaben. Und es wird kein schlechter Name zugewiesen - stattdessen wird eine Standardfehlermeldung an stderr geschrieben. Außerdem wird der Wert des Args gespeichert,$OPTARG
wenn das Argument in erster Linie der Name einer festgelegten Variablen war. Nachdem Sie dies getangetopts
haben, müssen Sie lediglich dieeval
Menge eines SetsOPTARG
in die entsprechende Zuordnung erweitern.quelle
export
einen seltsamen Namen zu finden, wird Ihr Computer nicht zerstört.var=something; varname=var; export "$varname"
ist vollkommen gültig. das gleiche gilt fürunset
und mit diesem und dem anderen, aber sobald der Inhalt dieser"$varname"
Variablen verrückt wird, könnte es bedauerlich sein. und sobash
passierte das ganze Debakel des Exports von Funktionen sowieso.