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

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

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

我理解env的作用,#!/usr/bin/env python等用例非常有意义.但是,我不明白你为什么要在交互式shell中为env添加前缀.

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

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

key=VALUE my_script
env key=VALUE my_script

基本相同.

不同之处在于,在第一个命令中,key = Value是shell语法的一部分,而不是执行命令的一部分. env是一个实际命令(通常不会内置到shell中).因此,有一些上下文需要使用env,例如,如果您正在运行调用另一个命令的命令.例如,如果您使用带有-exec选项的find:

find . -type f -exec some_command \;

some_command由find调用,而不是由shell调用,并且不会识别前导键= VALUE.你可以使用env来解决这个问题.

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

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

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

在最坏的情况下,这是一个无害的怪癖.它确实调用了一个额外的进程,效率可能略低,但在一个并不重要的交互式命令中.

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

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

相关文章
相关标签/搜索