假设我在 中调用A=B command
and 。是否存在两种调用之间可能存在差异的情况?env A=B command
bash
答案1
它们具有相同的目的(将给定的环境变量传递给命令)。然而,有一些显着的差异:
A=B command
是一个 shell (Bourne/POSIX/rc) 结构。
例如,您可以这样做:
A=B find . -exec cmd '{}' +
或者:
find . -exec env A=B cmd '{}' +
但你不能这样做:
find . -exec A=B cmd '{}' +
因为find
没有调用 shell 来运行该命令。
另一方面,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
它不是使用 shell 或env
执行此操作。它自己做。
它可以传递任何名称的变量,除了以-
.
赋值是一个 shell 构造,而 参数中的等号env
对 shell 没有特殊含义,因此A=$B cmd
是安全的,而env A="$B" cmd
(or sudo A="$B" cmd
) 需要双引号。
该A=B cmd
语法仅在 Bourne 和系列的 shell 中受支持rc
(es
尽管不是)。例如,在csh
或系列的 shell 中fish
,您必须求助于env
.