什么类型的shebang路径更可取?

在脚本中,第一行应指定解释器的路径。
但是在不同的服务器Linux,Unix或BSD上,这条路径可能会有所不同。

什么更可取?

#!/usr/bin/env bash 

要么

 #!/bin/bash 

如果要使用安装在标准位置的给定解释器的系统安装版本,请使用直接路径。 如果要在用户的$PATH中首先使用解释器的任何版本,请使用#!/usr/bin/env ...

env命令调用指定的命令,允许您设置或取消设置环境变量:

 env FOO=BAR do-something env DISPLAY=:0.0 xterm -ls & 

如果未指定任何环境变量或其他选项,则只会调用命名命令。 (以这种方式使用它可能有点像黑客。)

写作shebang的目的

 #!/usr/bin/env interp 

是调用$PATH中首先出现的interp

这意味着在编写脚本时,您不必知道interp确切位置(例如,它可能位于/bin/usr/bin/usr/local/bin )。 当然你必须知道env/usr/bin/env ,但这似乎是相当普遍的。

它的优点是它可以调用用户的$PATH首先出现的解释器版本。 缺点是它会调用用户的$PATH首先出现的解释器版本。

例如,假设我在我的主目录下安装了perl的个人版本,如$HOME/bin/perl ,并且我的$PATH前面有$HOME/bin 。 如果我运行一个shebang的脚本

 #!/usr/bin/env perl 

然后它将使用我自己安装的perl可执行文件运行 – 这可能不是一件好事。 该脚本的作者可能还没有使用我在一个月前从源代码构建的泛化边缘Perl进行测试。

对于像Perl或Bash这样的东西,它们可能安装在大多数系统上的一致位置(分别是/usr/bin/perl/bin/bash ),我会使用该命令的直接路径。 对于可以在不同系统上以不同方式安装的更加模糊的东西,我要么使用/usr/bin/env技巧,要么我会编写一个安装程序,在安装脚本时调整shebang行。 (我以前必须为我的Perl脚本执行此操作。)

更新:我在Unix和Linux网站的 这个问题的 答案中详细介绍了一下。

最佳做法是这样的:

 #!/usr/bin/env bash #!/usr/bin/env sh #!/usr/bin/env python 

等等…

当Ubuntu第一次开始使用破折号时,一些脚本就破了。 有人讨论过它。 大多数脚本都写成#!/bin/sh ,它是/ bin / bash的链接。 共识是:脚本编写者负责指定解释器。 因此,如果应始终使用BASH调用脚本,请从环境中指定它。 这样可以省去猜测路径,这在各种Unix / Linux系统上都是不同的。 此外,如果明天/ bin / sh成为某个其他shell的链接,如/ bin / wthsh或其他一些不在,它将起作用。

仅供参考,这是一个shee-bang #! ,你需要# 。 您可以使用此行来标识要运行脚本的解释器。

默认情况下,Ubuntu将/bin/sh链接到破折号

根据您对破折号的了解程度以及为什么破折号用于系统或守护程序shell,请参阅:

cyberciti.biz破折号

Ubuntu破解手册页

Bash是大多数Linux用户使用的默认shell,具有不同的function,然后破折号。 如果使用破折号运行,为bash编写的脚本可能正常运行,也可能无法运行,脚本越复杂,运行的可能性就越小。

为perl,python等编写的脚本将不会与/bin/sh/bin/bash

因此,当您编写脚本时,您可以确定应该使用什么解释器与shee-bang一起使用

选择使用的是脚本的作者,一个不比另一个好,它们都有各种特性,优点和缺点。