回答:
それらは同じ目的を果たします(指定された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 cat
cat
端末を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
。