私がandに電話したとしましょうA=B command
。 2つの呼び出しの間に違いがある可能性がありますか?env A=B command
bash
答え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
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
。