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?

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.