Ich kann laufen ENV_VAR=value command
, um command
mit einem bestimmten Wert für zu laufen ENV_VAR
. Was ist das Äquivalent zu unset ENV_VAR
für command
?
shell
environment-variables
Alexey Romanov
quelle
quelle
command
ist eine unglückliche Wahl der Platzhalter, da es tatsächlich ist ein integrierter Befehl mit diesem Namen.mycommand
odersomecommand
oder so könnte eine bessere Angewohnheit sein, umcmd
dafür.Antworten:
Anders als mit der
-i
Option, die die gesamte Umgebung löscht,env
bietet POSIX keine Möglichkeit, eine Variable zu löschen.Mit ein paar
env
Implementierungen (einschließlich GNUsbusybox
und FreeBSDs) können Sie jedoch Folgendes tun:Dies würde dazu führen, dass jede Instanz einer
ENV_VAR
Variablen aus der Umgebung entfernt wird (beachten Sie jedoch, dass dies für die Umgebungsvariable mit leerem Namen nicht funktioniert).env -u ''
Dies führt je nach Implementierung entweder zu einem Fehler oder ist unwirksam, auch wenn alle dies akzeptierenenv '=value'
, wahrscheinlich eine Einschränkung entsteht durch dieunsetenv()
C-Funktion, die POSIX benötigt, um einen Fehler für den leeren String zurückzugeben, während es fürputenv()
)) keine solche Einschränkung gibt .Portabel (in POSIX-Shells) können Sie:
(Beachten Sie, dass bei einigen Shells die Verwendung
exec
ändern kann, was ausgeführtcommand
wird: führt die im Dateisystem statt einer Funktion oder zum Beispiel einer eingebauten aus (und würde diealias
Erweiterung offensichtlich umgehen ), wieenv
oben. Sie möchten es in diesen Fällen weglassen.) .Dies funktioniert jedoch nicht für Umgebungsvariablen mit einem Namen, der keiner Shell-Variablen zugeordnet werden kann (beachten Sie, dass einige Shells
mksh
diese Variablen ohnehin beim Start aus der Umgebung entfernen würden), oder für Variablen, die als schreibgeschützt markiert wurden.-v
ist für die Bourne-Shell undbash
derenunset
without-v
könnte eineENV_VAR
Funktion deaktivieren , wenn es keine Variable mit diesem Namen gäbe . Die meisten anderen Shells würden Funktionen nur dann deaktivieren, wenn Sie die-f
Option übergeben. (Es ist unwahrscheinlich, dass dies in der Praxis einen Unterschied macht.)(Auch passen sie vom Bug / misfeature von
bash
/mksh
/yash
dessenunset
unter gewissen Umständen nicht die Variable unset kann, aber offenbaren die Variable in einem äußeren Umfang )Wenn
perl
verfügbar, können Sie Folgendes tun:Was auch für die Umgebungsvariable mit einem leeren Namen funktionieren wird.
Jetzt funktionieren all diese Funktionen nicht mehr, wenn Sie eine Umgebungsvariable für eine integrierte Funktion oder Funktion ändern und nicht möchten, dass sie in einer Subshell ausgeführt werden, wie in
bash
:(Hier wird LANG als falsch eingestellter Ansatz verwendet, um sicherzustellen, dass
.
das Dezimaltrennzeichen verwendet und verstanden wird. Es ist besser, dies zu tun .LC_ALL=C printf...
)Bei einigen Shells können Sie stattdessen einen lokalen Bereich für die Variable mithilfe einer Funktion erstellen:
Mit
zsh
können Sie auch eine anonyme Funktion verwenden:Dieser Ansatz funktioniert nicht in einigen Shells (wie denjenigen, die auf der Almquist-Shell basieren), deren
local
Variable nicht als anfänglich nicht festgelegt deklariert wird (sondern deren Wert und Attribute erbt). In denen kannst du das machenlocal ENV_VAR; unset ENV_VAR
, aber mach das nicht inmksh
oderyash
(typeset
anstattlocal
für das eine), da das nicht funktionieren würde, dasunset
würde nur das abbrechenlocal
.¹ Sie auch , dass in passen
bash
, die lokalENV_VAR
(auch wenn ungesetzt) würden das behalten Export - Attribut. Wenncommand
es sich also um eine Funktion handelt, die einen Wert zuweistENV_VAR
, ist die Variable in der Umgebung der anschließend aufgerufenen Befehle verfügbar.unset ENV_VAR
würde dieses Attribut löschen. Oder Sie könnten verwenden,local +x ENV_VAR
was ebenfalls für einen sauberen Slate sorgen würde (es sei denn, diese Variable wurde als schreibgeschützt deklariert, aber Sie können nichts dagegen tunbash
).quelle
env '=foo' python -c 'import os; print os.environ[""]'
. Ich erwarte nicht, dass viele Leute so eine Variable setzen wollen.Soweit ich weiß, gibt es keine direkte Entsprechung. Sie können eine Unterschale verwenden:
quelle
(unset ENV_VAR; exec somecommand)
wenn Sie in der Effizienz dem Original entsprechen möchten (indem Sie die Unterschale verbrauchen). So wie es ist, fügt dies eine zusätzliche Gabel hinzu.command
der letzte Befehl im Subshell-Aufruf ist.env -u
.Sie können verwenden
ENV_VAR= command
Dadurch wird die Variable nicht wirklich deaktiviert, aber es kann in vielen Fällen nützlich sein (Shell-Skripte werden normalerweise nur verwendet)
test -n
, um zu überprüfen, ob eine Variable festgelegt ist):quelle