Perl:Shebang(太空?)"#!"?

vol*_*ron 13 unix sh

我见过两个:

#!/path/...
#! /path/...
Run Code Online (Sandbox Code Playgroud)

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

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


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

Kei*_*son 18

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

根据维基百科的这篇文章,该#!语法于1980年1月在Version 8 Unix中引入.Dennis Ritchie最初宣布此功能的原因是:

系统已更改,以便正在执行的文件以魔术字符#开头!,该行的其余部分被理解为执行文件的解释器的名称.以前(实际上仍然),shell完成了大部分工作; 当文本文件的名称作为命令输入时,它会自动在具有可执行模式的文本文件上执行.将设施放入系统可带来以下好处.

[SNIP]

为了利用这个绝佳的机会,放

#! /bin/sh
Run Code Online (Sandbox Code Playgroud)

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

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

leonbloy的答案提供了更多背景信息.

更新:

Perl解释器本身可以识别以行为开头的行#!,即使在内核无法识别的系统上也是如此.运行!或查看此网页以获取详细信息.

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

Perl也允许空格后的空格#!.

(就个人而言,我更喜欢写perldoc perlrun没有空格的行,但它会以任何一种方式工作.)


leo*_*loy 9

它似乎通常都是双向的.看到这里.我会说无空间版本今天更常见,对我来说,更具吸引力.

顺便说一句,这与Perl没有特别的关系(但它肯定与编程有关).