Perl:Shebang(太空?)“#!”?

时间:2012-04-17 19:19:00

标签: unix sh

我见过两个:

#!/path/...
#! /path/...

什么是对的?有关系吗?有历史吗?

我听说过古老版本的Unix要求没有空间。但后来我听说这只是一个谣言。有人知道吗?


编辑:我想不出更好地问这个问题。这是编程相关的,因为空间可以使程序以不同的方式运行,我所知道的。因此我在这里问过。

2 个答案:

答案 0 :(得分:17)

我也有一个模糊的记忆,在一些旧的类Unix系统中不允许使用空格,但是一些研究并不支持这一点。

根据this Wikipedia article,1980年1月在版本8 Unix中引入了#!语法.Dennis Ritchie最初宣布此功能的说法是:

  

系统已更改,以便在正在执行的文件开始时   与神奇的人物#! ,其余部分被理解为   是执行文件的解释器的名称。以前(和   事实上,贝壳做了很多工作;它自动   文本时,在具有可执行模式的文本文件上执行自身   文件名被输入为命令。把设施放入   系统具有以下好处。

[SNIP]

  

利用这个绝佳的机会,把

#! /bin/sh
     

在shell脚本第一行的左边缘。空白   之后!没关系使用完整的路径名(不进行搜索)。在   整个行限制为16个字符,但这个限制   将被提出。

可以想象,一些类似Unix的系统支持#!语法,但在!之后不允许空格,但鉴于第一个实现明确允许空白,这似乎不太可能。< / p>

leonbloy的回答提供了更多背景信息。

更新:

Perl解释器本身识别以#!开头的行,即使在内核无法识别的系统上也是如此。有关详细信息,请运行perldoc perlrun或查看this web page

  

#!始终检查线路是否为线路   解析。因此,如果您在一台只允许一个参数的机器上   与#!线,或者更糟,甚至不认识#!行,你   无论Perl如何,仍然可以获得一致的切换行为   调用,即使-x用于查找程序的开头。

Perl还允许#!之后的空格。

(就个人而言,我更喜欢在没有空格的情况下编写#!行,但它会以任何一种方式工作。)

答案 1 :(得分:9)

它似乎通常都是双向的。 See here。我会说无空间版本今天更常见,对我来说,更具吸引力。

BTW,这与Perl没有特别关系(但它肯定与编程有关)。