大多数情况下,有没有一种Bash
shebang比其他shebang更为客观地优秀?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
- 等等
我模糊地记得很久以前听说在结尾添加一个破折号可以防止有人向您的脚本传递命令,但是找不到任何详细信息。
bash
不会存储在 /bin
中。 - ptiernoalias shebang='echo "#!/usr/bin/env bash"'
,现在我只需要打开终端并输入shebang,而不必再到这里去。 - Oylexenv
要放在 /usr/bin/env
这个路径下。实际上,只要它在 PATH 中可见即可,可能在任何地方,比如 /bin/env
或者 /dummy/env
(如果 /dummy
在 PATH 中的话)。在 POSIX 中,shebang 本身没有定义,所以我可以让 #!stop toaster
来启动 USB 咖啡机并且依旧符合 POSIX 标准。因此,#!/usr/bin/env bash
并不比 #!/bin/bash
更好,具体取决于移植性。 - darkfeline/usr/bin/env
的存在比 /bin/bash
和 /usr/bin/bash
中的任何一个都更常见,因此以这行代码开头的脚本将在尽可能多的机器上按预期运行。 - l0b0#!/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
的系统上运行脚本,可以修改脚本以指向正确的位置(这确实不方便)。
#!/usr/bin/env
也有特殊处理,对吗? - mtraceur#!
行上。 - Keith Thompson/bin/sh
链接到 /usr
中的任何位置,因为这样会使 init 脚本在 /usr
挂载之前运行变得相当困难。 - aij/bin
和 /sbin
默认情况下只是符号链接到 /usr/bin
和 /usr/sbin
,所以在这种情况下 /bin/sh
是一个指向 bash
的链接,实际目录是 /usr/bin
。但我会更正上面的内容。 - CodeClown42使用shebang行调用适当的解释器不仅适用于BASH。您可以在系统上使用任何解释语言的shebang,例如Perl,Python,PHP(CLI)和许多其他语言。顺便说一下,shebang
#!/bin/sh -
如果是两个破折号(--
),则选项结束后的所有内容都将被视为文件名和参数。
使用 env
命令可以使您的脚本具有可移植性,并允许您为脚本设置自定义环境,因此可移植脚本应使用该命令。
#!/usr/bin/env bash
无论是哪种语言,比如Perl
#!/usr/bin/env perl
一定要查看 bash
的 man
页面:
man bash
和 env
:
man env
注意:在 Debian 和基于 Debian 的系统(如 Ubuntu)中,sh
与 bash
不同,而是链接到 dash
。由于所有系统脚本都使用 sh
,因此 Debian 认为这样做可以使 bash 发展,并使系统保持稳定。
此外,为了保持*nix调用的方式,我从不在 shebang 调用的脚本中使用文件扩展名,因为你不能像在 Windows 上那样省略可执行文件的扩展名来调用它。文件命令可以将其识别为脚本。
这取决于你如何编写bash脚本。如果你的/bin/sh
是符号链接到bash,那么当bash作为sh
调用时,一些功能将不可用。
如果你想使用bash特定的非POSIX功能,请使用#!/bin/bash
pkg_add
安装它,则位于/usr/local/bin
中,该路径可能不在环境变量$PATH中。 - jwwPOSIX
功能怎么样? - Nikolan Asad#!/bin/sh
,不要明确指定bash。并且将脚本保持为POSIX兼容,而不是依赖于bash扩展。现在运行alpine linux的地方数量远远超过那些#!/bin/sh
无法工作的稀有奇怪系统的数量。#!/bin/sh
大多数脚本不需要特定的bash功能,应该编写为sh。
此外,这使得脚本可以在默认情况下没有bash的BSD上工作。
sh
和bash
之间的区别。 - tripleee
/usr/local/bin/bash
。 - jww#!/usr/bin/env bash
会带来特权升级安全威胁。用户可以简单地操纵他的PATH
,并获取任意bash可执行文件以代替运行,从而获得提升的权限。 - Ericbash
扩展),或者任何(POSIX)sh
都可以。 - mtraceur