Existe-t-il une différence entre ajouter une paire nom-valeur à une commande et utiliser env dans bash?

19

Disons que j'invoque A=B commandet env A=B commandentre bash. Y a-t-il une situation où il pourrait y avoir une différence entre les deux invocations?

Karl Richter
la source

Réponses:

26

Ils servent le même but (passez les vars env donnés à la commande). Cependant quelques différences notables:

A=B command

est une construction shell (Bourne / POSIX / rc).

Par exemple, vous pouvez faire:

A=B find . -exec cmd '{}' +

ou:

find . -exec env A=B cmd '{}' +

Mais vous ne pouvez pas faire:

find . -exec A=B cmd '{}' +

Parce que findn'invoque pas un shell pour exécuter cette commande.

En revanche, envétant une commande externe, vous ne pouvez pas faire:

f() { ...; }
env A=B f

ou:

env A=B eval '...'

Aussi:

A=B cmd

ne fonctionne qu'avec les vars env qui sont des noms de variables shell valides . Vous avez besoin envde tout autre nom env var:

env 'my var=foo' cmd...

bashréinitialise la _variable:

bash-4.3$ _=xxx env | grep '^_='
_=/usr/bin/env
bash-4.3$ env _=xxx env | grep '^_='
_=xxx

Dans zsh, ARGV0et STTYont des significations spéciales dans ce contexte:

STTY=-echo cat

Fonctionne catavec le terminal echodésactivé. Et:

ARGV0=foo cmd

fonctionne cmdavec foocomme son argv[0].

Si vous ne voulez pas ce traitement spécial, vous devez utiliser env.

Notez que sudoprend en charge:

sudo A=B cmd

Il ne s'agit pas d'utiliser le shell ou envde le faire. Il le fait par lui-même.

Il peut transmettre des variables avec n'importe quel nom sauf celles commençant par -.

L'affectation est une construction shell alors qu'un signe égal dans l'argument de envn'a pas de signification particulière pour le shell, donc A=$B cmdest sûr alors que env A="$B" cmd(ou sudo A="$B" cmd) nécessite des guillemets doubles.

La A=B cmdsyntaxe n'est prise en charge que dans les shells des Bourne et des rcfamilles (pas escependant). Dans les coquilles des familles cshou fishpar exemple, vous devez recourir à env.

Stéphane Chazelas
la source