我见过同事使用env
的前缀(交互式)shell命令,例如env KEY=value my_script
来调用my_script
。
我的问题是:在这里使用env
的重点是什么?你为什么不写KEY=value my_script
?
我理解env
的作用,#!/usr/bin/env python
等用例非常有意义。但是,我不明白为什么你会将env
加到交互式shell中的命令前面。
答案 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_command
由find
调用,而不是由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 question和my answer进行讨论。)