![shebang 中的哪种路径更可取?](https://linux22.com/image/1076500/shebang%20%E4%B8%AD%E7%9A%84%E5%93%AA%E7%A7%8D%E8%B7%AF%E5%BE%84%E6%9B%B4%E5%8F%AF%E5%8F%96%EF%BC%9F.png)
在脚本中,第一行应该指定解释器的路径。
但在不同的服务器(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 的原因,请参阅:
Bash 是大多数 Linux 用户使用的默认 shell,其功能与 dash 不同。为 bash 编写的脚本在用 dash 运行时可能会或可能不会正常运行,脚本越复杂,运行的可能性就越小。
用 perl、python 等编写的脚本根本无法使用/bin/sh
或运行/bin/bash
。
因此,当你编写脚本时,你要确定应该使用哪种解释器
使用什么是由脚本的作者决定的,并且没有哪个比另一个更好,它们都有各种特点、优点和缺点。