14

我都见过:

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

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

我听说古代版本的 Unix 要求没有空格。但后来我听说那只是一个谣言。有人确定吗?


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

4

2 回答 2

19

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

根据这篇 Wikipedia 文章,该#!语法于 1980 年 1 月在 Unix 版本 8 中引入。Dennis Ritchie 对该功能的最初公告说:

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

[剪辑]

为了利用这个绝妙的机会,把

#! /bin/sh

在你的 shell 脚本第一行的左边距。之后的空白!是可以的。使用完整的路径名(不进行搜索)。目前整行限制为 16 个字符,但此限制将提高。

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

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

更新 :

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

这 #!在解析线路时,总是检查线路是否有开关。因此,如果您使用的机器只允许一个带有 #! 的参数!行,或更糟糕的是,甚至不识别 #! 行,无论如何调用 Perl,您仍然可以获得一致的切换行为,即使 -x 用于查找程序的开头。

Perl 还允许在#!.

(就我个人而言,我更喜欢写#!没有空格的行,但无论哪种方式都可以。)

leonjoy的回答指向了 Sven Mascheck 的这个网页,该网页讨论了 #! 深入。(我现在提到这一点是因为最近对 comp.unix.shell 的讨论。)

于 2012-04-17T19:38:24.960 回答
10

它似乎通常双向工作。见这里。我想说的是,无空格版本在今天更为常见,而且对我来说更具吸引力。

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

于 2012-04-17T19:35:44.603 回答