Sagen wir, ich rufe A=B command
und env A=B command
in bash
. Gibt es eine Situation, in der es einen Unterschied zwischen beiden Aufrufen geben könnte?
Sagen wir, ich rufe A=B command
und env A=B command
in bash
. Gibt es eine Situation, in der es einen Unterschied zwischen beiden Aufrufen geben könnte?
Antworten:
Sie dienen demselben Zweck (übergeben Sie die angegebenen Umgebungsvariablen an den Befehl). Einige bemerkenswerte Unterschiede:
A=B command
ist ein Shell-Konstrukt (Bourne / POSIX / rc).
Zum Beispiel können Sie Folgendes tun:
A=B find . -exec cmd '{}' +
oder:
find . -exec env A=B cmd '{}' +
Aber Sie können nicht tun:
find . -exec A=B cmd '{}' +
Denn find
ruft keine Shell auf, um diesen Befehl auszuführen.
Andererseits können Sie env
als externer Befehl Folgendes nicht tun:
f() { ...; }
env A=B f
oder:
env A=B eval '...'
Ebenfalls:
A=B cmd
Funktioniert nur mit env- Variablen , die gültige Shell- Variablennamen sind. Sie benötigen env
für jeden anderen Umgebungsnamen:
env 'my var=foo' cmd...
bash
setzt die _
Variable zurück:
bash-4.3$ _=xxx env | grep '^_='
_=/usr/bin/env
bash-4.3$ env _=xxx env | grep '^_='
_=xxx
In zsh
, ARGV0
und STTY
hat eine besondere Bedeutung in diesem Zusammenhang:
STTY=-echo cat
Läuft cat
mit echo
deaktiviertem Terminal . Und:
ARGV0=foo cmd
läuft cmd
mit foo
wie sein argv[0]
.
Wenn Sie diese spezielle Verarbeitung nicht möchten, müssen Sie verwenden env
.
Beachten Sie, dass sudo
unterstützt:
sudo A=B cmd
Es geht nicht env
darum , die Shell zu benutzen oder das zu tun. Es macht es von selbst.
Es kann Variablen mit jedem Namen übergeben, mit Ausnahme derjenigen, die mit beginnen -
.
Assignment ist ein Shell-Konstrukt, während ein Gleichheitszeichen im Argument von env
keine besondere Bedeutung für die Shell hat. Es A=$B cmd
ist also sicher, wenn env A="$B" cmd
(oder sudo A="$B" cmd
) doppelte Anführungszeichen erforderlich sind.
Die A=B cmd
Syntax wird nur in den Shells der Bourne und ihrer rc
Familien unterstützt (allerdings nicht es
). In Schalen der csh
oder fish
Familien muss man zum Beispiel zurückgreifen env
.