“#!/ usr / bin / env bash”和“#!/ usr / bin / bash”之间的区别?

bash脚本的头文件中,这两个语句有什么区别?

  1. #!/usr/bin/env bash

  2. #!/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非常有用。 也许有这个细节,但这是我的理由