什么是首选Bash shebang?
有没有什么Bash
shebang在客观上比其他用途更好?
-
#!/usr/bin/env bash
-
#!/bin/bash
-
#!/bin/sh
-
#!/bin/sh -
- 等等
我隐约记得很久以前听说,加一个破折号来防止有人把命令传给你的脚本,但是找不到任何细节。
你应该使用#!/usr/bin/env bash
来实现可移植性 :不同的* nixes把bash
放在不同的地方,使用/usr/bin/env
是一个解决方法来运行在PATH
上find的第一个bash
。 而sh
不是bash
。
/bin/sh
通常是系统默认shell的链接,其中许多或大部分地方都是/usr/bin/bash
。 但是,原来的Bourne shell是sh
,所以如果你的脚本使用了一些bash
(第二代,“Bourne Again sh”),那么你应该更具体一些,并使用后者。 这样,在没有安装bash的系统上,脚本将不会运行。
我知道可能会有一部关于这个演变的令人兴奋的电影三部曲……但这可能是传闻。
使用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
被链接到不是bash
。 所有的系统脚本都使用sh
。 Debian说,这可以让bash增长,系统保持稳定。
另外,为了保持调用* nix,就像我从不在shebang调用的脚本上使用文件扩展名一样,因为您不能像在Windows上那样在可执行文件上调用扩展。 文件命令可以将其识别为脚本。
这真的取决于你如何编写你的bash脚本。 如果/bin/sh
被链接到bash,当bash被调用为sh
, 某些function不可用 。
如果你想使用特定于bash的非POSIX特性,请使用#!/bin/bash