Digamos que invoco A=B command
y env A=B command
en bash
. ¿Hay alguna situación en la que pueda haber una diferencia entre ambas invocaciones?
Digamos que invoco A=B command
y env A=B command
en bash
. ¿Hay alguna situación en la que pueda haber una diferencia entre ambas invocaciones?
Respuestas:
Sirven para el mismo propósito (pasar los envios dados al comando). Sin embargo, algunas diferencias notables:
A=B command
es una construcción de shell (Bourne / POSIX / rc).
Por ejemplo, puedes hacer:
A=B find . -exec cmd '{}' +
o:
find . -exec env A=B cmd '{}' +
Pero no puedes hacer:
find . -exec A=B cmd '{}' +
Porque find
no está invocando un shell para ejecutar ese comando.
Por otro lado, al env
ser un comando externo, no puedes hacer:
f() { ...; }
env A=B f
o:
env A=B eval '...'
También:
A=B cmd
funciona solo con env que son nombres de variables de shell válidos . Necesita env
cualquier otro nombre de env env:
env 'my var=foo' cmd...
bash
restablece la _
variable:
bash-4.3$ _=xxx env | grep '^_='
_=/usr/bin/env
bash-4.3$ env _=xxx env | grep '^_='
_=xxx
En zsh
, ARGV0
y STTY
tienen significados especiales en ese contexto:
STTY=-echo cat
Se ejecuta cat
con terminal echo
deshabilitado. Y:
ARGV0=foo cmd
corre cmd
con foo
como es argv[0]
.
Si no desea ese procesamiento especial, debe usarlo env
.
Tenga en cuenta que sudo
admite:
sudo A=B cmd
No está usando el shell ni env
para hacer eso. Lo hace solo.
Puede pasar variables con cualquier nombre excepto aquellos que comienzan con -
.
La asignación es una construcción de shell, mientras que un signo igual en el argumento de env
no tiene un significado especial para el shell, por lo que A=$B cmd
es seguro, mientras que env A="$B" cmd
(o sudo A="$B" cmd
) requieren comillas dobles.
La A=B cmd
sintaxis solo es compatible con los shells de Bourne y las rc
familias ( es
aunque no ). En los depósitos de las familias csh
o fish
, por ejemplo, debe recurrir a env
.