回答:
それらは同じ目的を果たします(指定されたenv変数をコマンドに渡します)。ただし、いくつかの注目すべき違いがあります。
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他の環境変数名が必要です:
env 'my var=foo' cmd...bash_変数をリセットします:
bash-4.3$ _=xxx env | grep '^_='
_=/usr/bin/env
bash-4.3$ env _=xxx env | grep '^_='
_=xxxでzsh、ARGV0そしてSTTYそのコンテキストで特別な意味を持っています:
STTY=-echo catcat端末をecho無効にして実行します。そして:
ARGV0=foo cmdとして実行cmdしfooますargv[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。