Answers:
它们具有相同的目的(将给定的环境变量传递给命令)。但是有一些明显的区别:
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
在zsh
,ARGV0
而STTY
在这方面特殊的含义:
STTY=-echo cat
cat
在echo
禁用终端的情况下运行。和:
ARGV0=foo cmd
运行cmd
与foo
作为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的外壳中受支持rc
(es
但不是)。例如,在csh
或fish
家庭的外壳中,您必须诉诸env
。