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


回答:


26

それらは同じ目的を果たします(指定された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

zshARGV0そしてSTTYそのコンテキストで特別な意味を持っています:

STTY=-echo cat

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

ARGV0=foo cmd

として実行cmdfooます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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.