“#!/ usr / bin / env bash”和“#!/ usr / bin / bash”之间的区别?
在bash
脚本的头文件中,这两个语句有什么区别?
-
#!/usr/bin/env bash
-
#!/usr/bin/bash
当我试图看到env
手册页时,我只是得到这个定义:
env - run a program in a modified environment
这是什么意思?
通过/usr/bin/env
运行命令有利于查找当前环境中程序的默认版本。
这样,您不必在系统的特定位置查找它,因为这些path可能位于不同系统的不同位置。 只要它在你的道路上,它会发现它。
缺点是,既然你没有调用一个明确的可执行文件,它就有可能发生错误,并且在多用户系统上存在安全问题(例如,如果有人设法让你的可执行文件在你的path中被称为bash
)。
#!/usr/bin/env bash #lends you some flexibility on different systems #!/usr/bin/bash #gives you explicit control on a given system of what executable is called
在某些情况下,第一个可能是首选(比如运行带有多个python版本的python脚本,而不必重写可执行文件行)。 但是在以安全性为重点的情况下,后者将是首选,因为它限制了代码注入的可能性。
使用#!/usr/bin/env NAME
使shellsearch$ PATH环境variables中名称的第一个匹配项。 如果您不知道绝对path或不想search它,它可能是有用的。
不是像/usr/bin/bash/
中那样通过使用env命令明确定义解释器的path,而是从第一次find解释器的位置开始search并启动解释器。 这既有利空也有弊端
我觉得它很有用,因为当我不知道env的时候,在开始编写脚本之前,我这样做了:
type nodejs > scriptname.js #or any other environment
然后我修改文件中的那一行到shebang。
我正在这样做,因为我并不总是记得我电脑上的nodejs在/ usr / bin /或/ bin /中,所以对我来说env
非常有用。 也许有这个细节,但这是我的理由