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
?
cmd
dafür.
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
?
cmd
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 GNUs busybox
und FreeBSDs) können Sie jedoch Folgendes tun:
env -u ENV_VAR command
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 akzeptieren env '=value'
, wahrscheinlich eine Einschränkung entsteht durch die unsetenv()
C-Funktion, die POSIX benötigt, um einen Fehler für den leeren String zurückzugeben, während es für putenv()
)) keine solche Einschränkung gibt .
Portabel (in POSIX-Shells) können Sie:
(unset -v ENV_VAR; exec command)
(Beachten Sie, dass bei einigen Shells die Verwendung exec
ändern kann, was ausgeführt command
wird: führt die im Dateisystem statt einer Funktion oder zum Beispiel einer eingebauten aus (und würde die alias
Erweiterung offensichtlich umgehen ), wie env
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 und bash
deren unset
without -v
könnte eine ENV_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
dessen unset
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:
perl -e 'delete $ENV{shift@ARGV}; exec @ARGV or die$!' ENV_VAR command
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
:
env -u LANG printf -v var %.3f 1.2 # would run /usr/bin/printf instead
(unset -v LANG; printf -v var %.3f 1.2) # changes to $var lost afterwards
(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:
without() {
local "$1" # $1 variable declared as initially unset in bash¹
shift
"$@"
}
without LANG printf -v var %.3f 1.2
Mit zsh
können Sie auch eine anonyme Funktion verwenden:
(){local ENV_VAR; command}
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 machen local ENV_VAR; unset ENV_VAR
, aber mach das nicht in mksh
oder yash
( typeset
anstatt local
für das eine), da das nicht funktionieren würde, das unset
würde nur das abbrechen local
.
¹ Sie auch , dass in passen bash
, die lokal ENV_VAR
(auch wenn ungesetzt) würden das behalten Export - Attribut. Wenn command
es sich also um eine Funktion handelt, die einen Wert zuweist ENV_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 tun bash
).
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:
(unset ENV_VAR; exec command)
(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):
$ export ENV_VAR=foo
$ mycommand
ENV_VAR: foo
$ ENV_VAR=bar mycommand
ENV_VAR: bar
$ ENV_VAR= mycommand
ENV_VAR:
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, um