在 bash 脚本的 Headers 中,这两个语句之间的区别是什么?
bash
#!/usr/bin/env bash
#!/usr/bin/bash
当我试图看到 env 手册页时,我得到了这个定义:
env
env - run a program in a modified environment
这是什么意思?
通过 /usr/bin/env 运行命令的好处是可以查找当前 env 版本中程序的默认版本 .
/usr/bin/env
这样,您不必在系统上的特定位置查找它,因为这些路径可能位于不同系统上的不同位置 . 只要它在你的道路上,它就会找到它 .
缺点是,因为你没有错误的可能性,并且在多用户系统上存在安全问题(例如,如果有人设法在你的路径中获得名为 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 使shell在$ PATH环境变量中搜索NAME的第一个匹配项 . 如果您不想搜索它,它会很有用 .
#!/usr/bin/env NAME
通过使用env命令,不是在 /usr/bin/bash/ 中显式定义解释器的路径,而是从首次找到解释器的任何地方搜索并启动解释器 . 这有两个upsides and downsides
/usr/bin/bash/
我发现它很有用,因为当我不知道env时,在我开始编写脚本之前我就是这样做的:
type nodejs > scriptname.js #or any other environment
然后我将文件中的那一行修改为shebang .我这样做,因为我并不总是记得我的计算机上的nodejs在哪里 - / usr / bin /或/ bin /,所以对我来说 env 非常有用 . 也许这里有细节,但这是我的理由
4 回答
通过
/usr/bin/env
运行命令的好处是可以查找当前 env 版本中程序的默认版本 .这样,您不必在系统上的特定位置查找它,因为这些路径可能位于不同系统上的不同位置 . 只要它在你的道路上,它就会找到它 .
缺点是,因为你没有错误的可能性,并且在多用户系统上存在安全问题(例如,如果有人设法在你的路径中获得名为
bash
的可执行文件) .在某些情况下,第一个可能是首选(如运行python脚本与多个版本的python,而不必重做可执行行) . 但在以安全性为重点的情况下,后者将是首选,因为它限制了代码注入的可能性 .
使用
#!/usr/bin/env NAME
使shell在$ PATH环境变量中搜索NAME的第一个匹配项 . 如果您不想搜索它,它会很有用 .通过使用env命令,不是在
/usr/bin/bash/
中显式定义解释器的路径,而是从首次找到解释器的任何地方搜索并启动解释器 . 这有两个upsides and downsides我发现它很有用,因为当我不知道env时,在我开始编写脚本之前我就是这样做的:
然后我将文件中的那一行修改为shebang .
我这样做,因为我并不总是记得我的计算机上的nodejs在哪里 - / usr / bin /或/ bin /,所以对我来说
env
非常有用 . 也许这里有细节,但这是我的理由