Eles são funcionalmente equivalentes.
A principal diferença é que env FOO=bar baz
envolve invocar um processo intermediário entre o shell e o baz
, em que, como com FOO=bar baz
, o shell invoca diretamente baz
.
Então, a esse respeito, FOO=bar baz
é o preferido.
As únicas situações em que me encontro usando env FOO=bar
in é onde eu tenho que passar um comando para outro comando.
Como um exemplo específico, digamos que possuo um script de wrapper que realiza algumas modificações do ambiente e, em seguida, chama exec
no comando que foi passado para ele, como:
#!/bin/bash
FOO=bob
some stuff
exec "$@"
Se você executá-lo como myscript FOO=bar baz
, o exec
lançará um erro, pois exec FOO=bar baz
é inválido.
Em vez disso, você o chama como myscript env FOO=bar baz
, que é executado como exec env FOO=bar baz
e é perfeitamente válido.