首页 文章

什么是首选的Bash shebang?

提问于
浏览
831

在大多数用途中,是否客观上比其他人更好?

  • #!/usr/bin/env bash

  • #!/bin/bash

  • #!/bin/sh

  • #!/bin/sh -

我很清楚地回忆起很久以前的一次听说,在最后添加一个破折号可以防止有人将命令传递给你的脚本,但却无法找到任何细节 .

5 回答

  • 64

    您应该将 #!/usr/bin/env bash 用于portability:不同的* nixes将 bash 放在不同的位置,并使用 /usr/bin/env 是一种解决方法来运行 PATH 上找到的第一个 bash . 并且 sh is not bash .

  • 17

    /bin/sh 通常是系统默认shell的链接,通常是 bash 但是,例如,Debian系统的权重较轻 dash . 无论哪种方式,原始的Bourne shell都是 sh ,所以如果你的脚本使用了一些 bash (第2代,"Bourne Again sh")特定功能( [[ ]] 测试,数组,各种含糖的东西等),那么你应该更具体并使用后者 . 这样,在未安装bash的系统上,您的脚本将无法运行 . 我知道可能有一部关于这种演变的令人兴奋的电影三部曲...但这可能是传闻 .

    另请注意,当 sh 被唤起时, bash 在某种程度上behaves as POSIX standard sh (另见the GNU docs) .

  • 3

    使用shebang行来调用适当的解释器不仅仅适用于BASH . 您可以将shebang用于系统上的任何解释语言,例如Perl,Python,PHP(CLI)和许多其他语言 . 顺便说一句,shebang

    #!/bin/sh -
    

    (它也可以是两个破折号,即 -- )结束bash选项后将被视为文件名和参数 .

    使用 env 命令可使脚本可移植,并允许您为脚本设置自定义环境,因此可移植脚本应使用

    #!/usr/bin/env bash
    

    或者对于Perl这样的语言

    #!/usr/bin/env perl
    

    请务必查看 manman 页面:

    man bash
    

    env

    man env
    

    注意:在Debian和基于Debian的系统上,如Ubuntu, sh 链接到 dash 而不是 bash . 由于所有系统脚本都使用 sh . 根据Debian的说法,这可以让bash成长并使系统保持稳定 .

    另外,保持调用* nix就像我从不在shebang调用的脚本上使用文件扩展名一样,因为你不能像在Windows上那样省略可执行文件调用的扩展名 . file命令可以将其标识为脚本 .

  • 2

    这实际上取决于你如何编写bash脚本 . 如果将 /bin/sh 符号链接为bash,则将bash作为 shsome features are unavailable调用 .

    如果您需要特定于bash的非POSIX功能,请使用 #!/bin/bash

  • 1137

    我建议使用:

    #!/bin/bash
    

    它不是100%可移植的(某些系统将 bash 放在 /bin 以外的位置),但是许多现有脚本使用 #!/bin/bash 压迫各种操作系统使 /bin/bash 至少成为主要位置的符号链接 .

    替代方案:

    #!/usr/bin/env bash
    

    有人建议 - 但不能保证 env 命令在 /usr/bin (和've used systems where it isn't) . 此外,此表单将在当前用户 $PATH 中使用 bash 的第一个实例,这可能不是bash shell的合适版本 .

    如果您需要在没有 /bin/bash 的系统上运行脚本,则可以修改脚本以指向正确的位置(这无疑是不方便的) .

    我已经在my answerthis question讨论了更深入的权衡 .

相关问题