![](/img/trans.png)
[英]What are all options to execute and source a bash file? Why shebang is not checked?
[英]What is the preferred Bash shebang ("#!")?
对于大多数用途,是否有任何Bash
shebang 客观上比其他更好?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
我依稀记得很久以前听说在末尾添加破折号可以防止有人向您的脚本传递命令,但找不到任何详细信息。
我建议使用:
#!/bin/bash
它不是 100% 可移植的(某些系统将bash
放置在/bin
以外的位置),但是许多现有脚本使用#!/bin/bash
的事实迫使各种操作系统使/bin/bash
至少成为指向主要位置。
替代方案:
#!/usr/bin/env bash
已被建议 - 但不能保证env
命令在/usr/bin
(我已经使用了它不在的系统)。 此外,此表单将使用当前用户$PATH
的第一个bash
实例,这可能不是 bash shell 的合适版本。
(但是/usr/bin/env
应该可以在任何合理的现代系统上运行,要么是因为env
在/usr/bin
,要么是因为系统做了一些事情来使它工作。我上面提到的系统是 SunOS 4,我可能没有大约 25 年未使用。)
如果您需要一个脚本在没有/bin/bash
的系统上运行,您可以修改脚本以指向正确的位置(这无疑是不方便的)。
一个有点模糊的更新:我使用的一个系统, Termux ,一个在 Android 下运行的类似桌面 Linux 的层,没有/bin/bash
( bash
是/data/data/com.termux/files/usr/bin/bash
) - 但它有特殊的处理来支持#!/bin/bash
。
/bin/sh
通常是指向系统默认 shell 的链接,它通常是bash
但在例如 Debian 系统上是较轻的dash
。 无论哪种方式,原始的 Bourne shell 都是sh
,所以如果您的脚本使用了一些bash
(第二代,“Bourne Again sh”)特定功能( [[ ]]
测试、数组、各种含糖的东西等),那么您应该更具体,稍后使用。 这样,在未安装 bash 的系统上,您的脚本将不会运行。 我知道可能会有一部关于这种演变的令人兴奋的电影三部曲……但这可能是道听途说。
另请注意,当作为sh
, bash
在某种程度上表现为 POSIX 标准sh
(另请参阅关于此的 GNU 文档)。
使用 shebang 行调用适当的解释器不仅适用于 BASH。 您可以将 shebang 用于系统上的任何解释性语言,例如 Perl、Python、PHP (CLI) 和许多其他语言。 顺便说一句,shebang
#!/bin/sh -
(它也可以是两个破折号,即--
)结束 bash 选项之后的所有内容都将被视为文件名和参数。
使用env
命令使您的脚本可移植,并允许您为脚本设置自定义环境,因此可移植脚本应使用
#!/usr/bin/env bash
或者任何语言,例如 Perl
#!/usr/bin/env perl
请务必查看bash
的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
调用时, 某些功能将不可用。
如果您想要特定于 bash 的非 POSIX 功能,请使用#!/bin/bash
给#./usr/bin/env 方法再投一票,我经常使用虚拟环境。 在我的情况下,我使用安装在 virtualenv 中的 python。 使用 #./usr/bin/python 可能不是我想要的 python。 我使用 #!/usr/bin/env python 得到了正确的 python。
#!/bin/sh
因为大多数脚本不需要特定的 bash 功能,应该为 sh 编写。
此外,这使得脚本可以在默认情况下没有 bash 的 BSD 上运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.