在命令前添加名称/值对与在bash中使用env之间有区别吗?


Answers:


26

它们具有相同的目的(将给定的环境变量传递给命令)。但是有一些明显的区别:

A=B command

是一个shell(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

仅适用于有效shell变量名称的env vars 。您需要env其他任何环境变量名称:

env 'my var=foo' cmd...

bash重置_变量:

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

zshARGV0STTY在这方面特殊的含义:

STTY=-echo cat

catecho禁用终端的情况下运行。和:

ARGV0=foo cmd

运行cmdfoo作为argv[0]

如果您不想进行特殊处理,则必须使用env

注意sudo支持:

sudo A=B cmd

它不是在使用shell或env那样做。它自己完成。

它可以传递任何名称的变量,但以。开头的变量除外 -

赋值是一个shell构造,而论点中的等号env对shell没有特殊含义,因此A=$B cmd是安全的,而env A="$B" cmd(或sudo A="$B" cmd)需要双引号。

A=B cmd语法仅在Bourne和family的外壳中受支持rces但不是)。例如,在cshfish家庭的外壳中,您必须诉诸env

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.