Sagen wir, ich rufe A=B commandund env A=B commandin bash. Gibt es eine Situation, in der es einen Unterschied zwischen beiden Aufrufen geben könnte?
Sagen wir, ich rufe A=B commandund env A=B commandin 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 findruft keine Shell auf, um diesen Befehl auszuführen.
Andererseits können Sie envals 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 envfür jeden anderen Umgebungsnamen:
env 'my var=foo' cmd...
bashsetzt die _Variable zurück:
bash-4.3$ _=xxx env | grep '^_='
_=/usr/bin/env
bash-4.3$ env _=xxx env | grep '^_='
_=xxx
In zsh, ARGV0und STTYhat eine besondere Bedeutung in diesem Zusammenhang:
STTY=-echo cat
Läuft catmit echodeaktiviertem Terminal . Und:
ARGV0=foo cmd
läuft cmdmit foowie sein argv[0].
Wenn Sie diese spezielle Verarbeitung nicht möchten, müssen Sie verwenden env.
Beachten Sie, dass sudounterstützt:
sudo A=B cmd
Es geht nicht envdarum , 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 envkeine besondere Bedeutung für die Shell hat. Es A=$B cmdist also sicher, wenn env A="$B" cmd(oder sudo A="$B" cmd) doppelte Anführungszeichen erforderlich sind.
Die A=B cmdSyntax wird nur in den Shells der Bourne und ihrer rcFamilien unterstützt (allerdings nicht es). In Schalen der cshoder fishFamilien muss man zum Beispiel zurückgreifen env.