Digamos que eu chame A=B command
e env A=B command
entre bash
. Existe alguma situação em que possa haver uma diferença entre as duas invocações?
Digamos que eu chame A=B command
e env A=B command
entre bash
. Existe alguma situação em que possa haver uma diferença entre as duas invocações?
Respostas:
Eles servem ao mesmo propósito (passe os envios fornecidos ao comando). No entanto, algumas diferenças notáveis:
A=B command
é uma construção shell (Bourne / POSIX / rc).
Por exemplo, você pode fazer:
A=B find . -exec cmd '{}' +
ou:
find . -exec env A=B cmd '{}' +
Mas você não pode fazer:
find . -exec A=B cmd '{}' +
Porque find
não está invocando um shell para executar esse comando.
Por outro lado, env
sendo um comando externo, você não pode fazer:
f() { ...; }
env A=B f
ou:
env A=B eval '...'
Além disso:
A=B cmd
funciona apenas com env vars que são nomes válidos de variáveis de shell . Você precisa env
de qualquer outro nome de var env:
env 'my var=foo' cmd...
bash
redefine a _
variável:
bash-4.3$ _=xxx env | grep '^_='
_=/usr/bin/env
bash-4.3$ env _=xxx env | grep '^_='
_=xxx
Em zsh
, ARGV0
e STTY
têm significados especiais nesse contexto:
STTY=-echo cat
Funciona cat
com o terminal echo
desativado. E:
ARGV0=foo cmd
corre cmd
com foo
como seu argv[0]
.
Se você não quiser esse processamento especial, precisará usar env
.
Observe que sudo
suporta:
sudo A=B cmd
Não está usando o shell ou env
para fazer isso. Faz isso por si só.
Pode passar variáveis com qualquer nome, exceto aquelas que começam com -
.
A atribuição é uma construção de shell, enquanto um sinal de igual no argumento de env
não tem significado especial para o shell, portanto, A=$B cmd
é seguro enquanto env A="$B" cmd
(ou sudo A="$B" cmd
) exige aspas duplas.
A A=B cmd
sintaxe é suportada apenas nas conchas dos Bourne e das rc
famílias ( es
embora não ). Em conchas csh
ou fish
famílias, por exemplo, você precisa recorrer env
.