コマンドの前に名前と値のペアを追加することとbashでenvを使用することに違いはありますか?

コマンドの前に名前と値のペアを追加することとbashでenvを使用することに違いはありますか?

私がandに電話したとしましょうA=B command。 2つの呼び出しの間に違いがある可能性がありますか?env A=B commandbash

答え1

これらは同じ目的を果たします(与えられた環境変数をコマンドに渡します)。しかし、いくつかの重要な違いがあります。

A=B command

シェル (Bourne/POSIX/rc) 構造です。

たとえば、次のようにできます。

A=B find . -exec cmd '{}' +

または:

find . -exec env A=B cmd '{}' +

ただし、次の場合は次のことはできません。

find . -exec A=B cmd '{}' +

findコマンドを実行するために呼び出されるシェルがないためです。

一方、env外部コマンドでは次のことはできません。

f() { ...; }
env A=B f

または:

env A=B eval '...'

返品:

A=B cmd

有効な環境変数でのみ機能します。シェル変数名。必要なenv追加の環境変数名は次のとおりです。

env 'my var=foo' cmd...

bash変数のリセット_:

bash-4.3$ _=xxx env | grep '^_='
_=/usr/bin/env
bash-4.3$ env _=xxx env | grep '^_='
_=xxx

zshARGV0および では、STTYこの文脈で特別な意味を持ちます。

STTY=-echo cat

cat端末を無効にした状態で実行しますecho。そして:

ARGV0=foo cmd

それとして実行しなさいcmdfooargv[0]

特別な処理をしたくない場合は、を使用する必要がありますenv

sudo以下のサポートを参照してください。

sudo A=B cmd

シェルを使用したり、これを行うわけではありませんenv。それは自分の仕事をします。

を除く任意の名前の変数を渡すことができます-

割り当てはシェル構成であり、パラメータの等号はenvシェルに特別な意味がないためA=$B cmd安全ですが、env A="$B" cmd(またはsudo A="$B" cmd)には二重引用符が必要です。

このA=B cmd構文は Bourne と系列シェルでのみサポートされますrc(esただし、サポートされていませんが).たとえば、cshまたは一連のシェルでは、fishに頼る必要がありますenv

関連情報