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

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

假设我在 中调用A=B commandand 。是否存在两种调用之间可能存在差异的情况?env A=B commandbash

答案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

zshARGV0和中STTY,在该上下文中具有特殊含义:

STTY=-echo cat

cat在禁用终端的情况下运行echo。和:

ARGV0=foo cmd

与其cmd一起运行。fooargv[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 中受支持rces尽管不是)。例如,在csh或系列的 shell 中fish,您必须求助于env.

相关内容