Gibt es einen Unterschied zwischen dem Voranstellen eines Name-Wert-Paares vor einem Befehl und der Verwendung von env in bash?

19

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?

Karl Richter
quelle

Antworten:

26

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.

Stéphane Chazelas
quelle