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?
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?
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 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.