什么是首选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 

请务必查看bashman页:

 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