“#!/usr/bin/env bash”和“#!/usr/bin/bash”之间有什么区别?

在Bash脚本的头中,这两个语句之间有什么区别:

  1. #/usr/bin/env bash

  2. #/usr/bin/bash

当我查阅env手册页时,我得到了以下定义:

env-在修改过的环境中运行程序

这是什么意思

通过/usr/bin/env运行命令有助于查找当前env环境中程序的默认版本

这样,您就不必在系统上的特定位置查找它,因为这些路径可能位于不同系统上的不同位置。只要它在你的道路上,它就会找到它

一个缺点是,如果您希望支持Linux,您将无法传递多个参数(例如,您将无法编写/usr/bin/env awk-f),因为POSIX对如何解释该行含糊不清,Linux将在第一个空格后解释所有内容以表示单个参数。您可以在一些版本的env上使用/usr/bin/env-S来解决这个问题,但是脚本的可移植性会变得更差,并且会在相当新的系统上中断(例如,即使是Ubuntu 16.04,如果不是更高版本的话)

另一个缺点是,由于您没有调用显式可执行文件,因此它有可能出错,并且在多用户系统上存在安全问题(例如,如果有人在您的路径中成功地将其可执行文件名为bash

#/usr/bin/env bash#为您在不同系统上提供了一些灵活性
#!/usr/bin/bash#为您提供了对给定系统的可执行文件调用的显式控制

在某些情况下,第一种可能是首选的(比如使用多个版本的python运行python脚本,而不必重新编写可执行行)。但在安全性是重点的情况下,后者将是首选,因为它限制了代码注入的可能性

发表评论