Disons que j'invoque A=B command
et env A=B command
entre bash
. Y a-t-il une situation où il pourrait y avoir une différence entre les deux invocations?
Disons que j'invoque A=B command
et env A=B command
entre bash
. Y a-t-il une situation où il pourrait y avoir une différence entre les deux invocations?
Réponses:
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 find
n'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 env
de tout autre nom env var:
env 'my var=foo' cmd...
bash
réinitialise la _
variable:
bash-4.3$ _=xxx env | grep '^_='
_=/usr/bin/env
bash-4.3$ env _=xxx env | grep '^_='
_=xxx
Dans zsh
, ARGV0
et STTY
ont des significations spéciales dans ce contexte:
STTY=-echo cat
Fonctionne cat
avec le terminal echo
désactivé. Et:
ARGV0=foo cmd
fonctionne cmd
avec foo
comme son argv[0]
.
Si vous ne voulez pas ce traitement spécial, vous devez utiliser env
.
Notez que sudo
prend en charge:
sudo A=B cmd
Il ne s'agit pas d'utiliser le shell ou env
de 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 env
n'a pas de signification particulière pour le shell, donc A=$B cmd
est sûr alors que env A="$B" cmd
(ou sudo A="$B" cmd
) nécessite des guillemets doubles.
La A=B cmd
syntaxe n'est prise en charge que dans les shells des Bourne et des rc
familles (pas es
cependant). Dans les coquilles des familles csh
ou fish
par exemple, vous devez recourir à env
.