为什么我会在命令之前使用env?

时间:2014-12-14 01:59:14

标签: bash shell

我见过同事使用env的前缀(交互式)shell命令,例如env KEY=value my_script来调用my_script

我的问题是:在这里使用env的重点是什么?你为什么不写KEY=value my_script

我理解env的作用,#!/usr/bin/env python等用例非常有意义。但是,我不明白为什么你会将env加到交互式shell中的命令前面。

1 个答案:

答案 0 :(得分:8)

可能没有充分的理由说明为什么 在交互式命令中使用env

在Bourne派生的shell(sh,ksh,bash,zsh)中,这两个命令:

key=VALUE my_script
env key=VALUE my_script

基本相同。

不同之处在于,在第一个命令中,key=Value是shell语法的一部分,而不是执行命令的一部分。 env是一个实际命令(它通常不包含在shell中)。因此,有些情况需要使用env,例如,如果您正在运行调用另一个命令的命令。例如,如果您使用find选项使用-exec

find . -type f -exec some_command \;

然后some_commandfind调用,而不是由shell调用,并且领先的key=VALUE不会被识别。您可以使用env解决此问题。

但这是一个相当不寻常的情况,它并不适用于运行简单的命令。

另一个可能的原因是csh和tcsh shell(不是从Bourne shell派生的)不使用相同的语法。习惯于以交互方式使用csh或tcsh的人可能会习惯使用env key=Value my_script

或者有人可能会觉得使用env命令更明确,因此更清晰。

最糟糕的是,这是一个无害的怪癖。它确实调用了一个额外的过程,效率可能略低,但是在一个并不重要的交互式命令中。

正如chepner的评论指出env命令允许你设置名称不是有效的shell变量名的环境变量(虽然这很少是一个好主意),并且-i选项允许您在设置变量之前清除现有环境。

(至于#!/usr/bin/env黑客,请参阅this questionmy answer进行讨论。)