在大多数用途中,是否客观上比其他人更好?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
等
我很清楚地回忆起很久以前的一次听说,在最后添加一个破折号可以防止有人将命令传递给你的脚本,但却无法找到任何细节 .
您应该将 #!/usr/bin/env bash 用于portability:不同的* nixes将 bash 放在不同的位置,并使用 /usr/bin/env 是一种解决方法来运行 PATH 上找到的第一个 bash . 并且 sh is not bash .
bash
/usr/bin/env
PATH
/bin/sh 通常是系统默认shell的链接,通常是 bash 但是,例如,Debian系统的权重较轻 dash . 无论哪种方式,原始的Bourne shell都是 sh ,所以如果你的脚本使用了一些 bash (第2代,"Bourne Again sh")特定功能( [[ ]] 测试,数组,各种含糖的东西等),那么你应该更具体并使用后者 . 这样,在未安装bash的系统上,您的脚本将无法运行 . 我知道可能有一部关于这种演变的令人兴奋的电影三部曲...但这可能是传闻 .
/bin/sh
dash
sh
[[ ]]
另请注意,当 sh 被唤起时, bash 在某种程度上behaves as POSIX standard sh (另见the GNU docs) .
使用shebang行来调用适当的解释器不仅仅适用于BASH . 您可以将shebang用于系统上的任何解释语言,例如Perl,Python,PHP(CLI)和许多其他语言 . 顺便说一句,shebang
(它也可以是两个破折号,即 -- )结束bash选项后将被视为文件名和参数 .
--
使用 env 命令可使脚本可移植,并允许您为脚本设置自定义环境,因此可移植脚本应使用
env
或者对于Perl这样的语言
#!/usr/bin/env perl
请务必查看 man 的 man 页面:
man
man bash
和 env :
man env
注意:在Debian和基于Debian的系统上,如Ubuntu, sh 链接到 dash 而不是 bash . 由于所有系统脚本都使用 sh . 根据Debian的说法,这可以让bash成长并使系统保持稳定 .
另外,保持调用* nix就像我从不在shebang调用的脚本上使用文件扩展名一样,因为你不能像在Windows上那样省略可执行文件调用的扩展名 . file命令可以将其标识为脚本 .
这实际上取决于你如何编写bash脚本 . 如果将 /bin/sh 符号链接为bash,则将bash作为 sh ,some features are unavailable调用 .
如果您需要特定于bash的非POSIX功能,请使用 #!/bin/bash
我建议使用:
它不是100%可移植的(某些系统将 bash 放在 /bin 以外的位置),但是许多现有脚本使用 #!/bin/bash 压迫各种操作系统使 /bin/bash 至少成为主要位置的符号链接 .
/bin
/bin/bash
替代方案:
有人建议 - 但不能保证 env 命令在 /usr/bin (和've used systems where it isn't) . 此外,此表单将在当前用户 $PATH 中使用 bash 的第一个实例,这可能不是bash shell的合适版本 .
/usr/bin
$PATH
如果您需要在没有 /bin/bash 的系统上运行脚本,则可以修改脚本以指向正确的位置(这无疑是不方便的) .
我已经在my answer到this question讨论了更深入的权衡 .
5 回答
您应该将 #!/usr/bin/env bash 用于portability:不同的* nixes将
bash
放在不同的位置,并使用/usr/bin/env
是一种解决方法来运行PATH
上找到的第一个bash
. 并且 sh is not bash ./bin/sh
通常是系统默认shell的链接,通常是bash
但是,例如,Debian系统的权重较轻dash
. 无论哪种方式,原始的Bourne shell都是sh
,所以如果你的脚本使用了一些bash
(第2代,"Bourne Again sh")特定功能([[ ]]
测试,数组,各种含糖的东西等),那么你应该更具体并使用后者 . 这样,在未安装bash的系统上,您的脚本将无法运行 . 我知道可能有一部关于这种演变的令人兴奋的电影三部曲...但这可能是传闻 .另请注意,当
sh
被唤起时,bash
在某种程度上behaves as POSIX standardsh
(另见the GNU docs) .使用shebang行来调用适当的解释器不仅仅适用于BASH . 您可以将shebang用于系统上的任何解释语言,例如Perl,Python,PHP(CLI)和许多其他语言 . 顺便说一句,shebang
(它也可以是两个破折号,即
--
)结束bash选项后将被视为文件名和参数 .使用
env
命令可使脚本可移植,并允许您为脚本设置自定义环境,因此可移植脚本应使用或者对于Perl这样的语言
请务必查看
man
的man
页面:和
env
:注意:在Debian和基于Debian的系统上,如Ubuntu,
sh
链接到dash
而不是bash
. 由于所有系统脚本都使用sh
. 根据Debian的说法,这可以让bash成长并使系统保持稳定 .另外,保持调用* nix就像我从不在shebang调用的脚本上使用文件扩展名一样,因为你不能像在Windows上那样省略可执行文件调用的扩展名 . file命令可以将其标识为脚本 .
这实际上取决于你如何编写bash脚本 . 如果将
/bin/sh
符号链接为bash,则将bash作为sh
,some features are unavailable调用 .如果您需要特定于bash的非POSIX功能,请使用
#!/bin/bash
我建议使用:
它不是100%可移植的(某些系统将
bash
放在/bin
以外的位置),但是许多现有脚本使用#!/bin/bash
压迫各种操作系统使/bin/bash
至少成为主要位置的符号链接 .替代方案:
有人建议 - 但不能保证
env
命令在/usr/bin
(和've used systems where it isn't) . 此外,此表单将在当前用户$PATH
中使用bash
的第一个实例,这可能不是bash shell的合适版本 .如果您需要在没有
/bin/bash
的系统上运行脚本,则可以修改脚本以指向正确的位置(这无疑是不方便的) .我已经在my answer到this question讨论了更深入的权衡 .