shebang 中的哪种路径更可取?

shebang 中的哪种路径更可取?

在脚本中,第一行应该指定解释器的路径。
但在不同的服务器(Linux、Unix 或 BSD)上,此路径可能不同。

有什么更好的选择?

#!/usr/bin/env bash 

或者

#!/bin/bash 

答案1

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

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

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

如果您不指定任何环境变量或其他选项,它将仅调用命名的命令。(以这种方式使用它可以说是有点黑客行为。)

编写shebang的目的是

#!/usr/bin/env interp

是调用interp中首先出现的任何内容$PATH

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

其优点是它会调用用户程序中首先出现的解释器版本$PATH坏处是它调用在用户的 中首先出现的解释器版本$PATH

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

#!/usr/bin/env perl

那么它将使用我自己安装的perl可执行文件运行——这可能不是一件好事。脚本的作者可能还没有用我一个月前从源代码构建的前沿 Perl 来测试它。

对于 Perl 或 Bash 等可能在大多数系统上安装在一致位置的程序(分别为/usr/bin/perl/bin/bash),我会使用命令的直接路径。对于可能在不同系统上以不同方式安装的更晦涩难懂的程序,我要么使用技巧/usr/bin/env,要么编写一个安装程序,在安装脚本时调整 shebang 行。(我以前必须对我的 Perl 脚本这样做。)

更新 :我已经详细介绍了这个答案这个问题Unix 和 Linux 网站

答案2

最佳做法是这样的:

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

等等...

当 Ubuntu 首次开始使用 dash 时,一些脚本崩溃了。对此有过讨论。大多数脚本都是#!/bin/sh指向 /bin/bash 的链接。共识是:脚本编写者负责指定解释器。因此,如果您的脚本始终需要使用 BASH 调用,请从环境中指定它。这样就不必猜测路径,因为路径在不同的 Unix/Linux 系统上是不同的。此外,如果明天 /bin/sh 成为指向其他 shell(如 /bin/wthsh 或其他无意义的 shell)的链接,它也会正常工作。

答案3

仅供参考,这是一个大问题#!,您需要#。您可以使用此行来识别使用哪个解释器来运行脚本。

默认情况下,Ubuntu 链接/bin/sh到 dash

根据您对 dash 的了解程度以及 dash 用于系统或守护进程 shell 的原因,请参阅:

cyberciti.biz dash

Ubuntu dash 手册页

Bash 是大多数 Linux 用户使用的默认 shell,其功能与 dash 不同。为 bash 编写的脚本在用 dash 运行时可能会或可能不会正常运行,脚本越复杂,运行的可能性就越小。

用 perl、python 等编写的脚本根本无法使用/bin/sh或运行/bin/bash

因此,当你编写脚本时,你要确定应该使用哪种解释器

使用什么是由脚本的作者决定的,并且没有哪个比另一个更好,它们都有各种特点、优点和缺点。

相关内容