Perl: Shebang (space?) "#! "?

14
我见过两种:
#!/path/...
#! /path/...

什么是正确的?这重要吗?有历史吗?
我听说过一种古老版本的Unix需要没有空格。但后来我听说那只是一个谣言。有人能确定吗?
编辑:我想不出更好的地方来问这个问题。它与编程有关,因为空格可能会使程序以不同的方式运行,我不知道。因此我在这里问了这个问题。

2
我不确定这与编程无关。 - ergosys
3
@ergosys,是的,这个问题从技术上只与内核有关(不涉及编程),但编程的一部分是让内核运行您的程序。我不介意在这里提出这个问题,并且有能力回答这个问题。(如何投票以避免关闭?) - ikegami
1
@ikegami,我不同意,这与编写脚本有关,而编写脚本就是编程。 - ergosys
@ergosys,它不被脚本语言所使用,因此与编写脚本无关,就像有关cp用法的问题一样。(好吧,perl解析它以支持不支持#!的系统。例如,将带有#!/usr/bin/python的文件传递给perl,它将启动python。例如,将带有#!/usr/bin/perl -w的文件传递给perl,即使没有使用#!行来启动脚本,它也会打开警告。Perl不在乎#!后面是否有空格。) - ikegami
并不是说我们会偏离主题,但如果有人想从更古老的东西构建新内核,那就很好了解。随着时间的推移,我对Unix/Linux的了解已经逐渐淡化,而且我相信它从来没有比你们中的一些人更好过。 - vol7ron
显示剩余7条评论
2个回答

19
I also have a vague memory that whitespace was not allowed in some old Unix-like systems, but a bit of research doesn't support that.
根据这篇维基百科文章#!语法是在1980年1月的Unix第8版中引入的。Dennis Ritchie最初发布此功能的声明如下:

系统已更改,以便如果要执行的文件以神奇字符#!开头,则理解该行的其余部分为执行文件的解释器的名称。 以前(事实上仍然如此),shell大部分工作都可以完成; 当文本文件的名称被键入为命令时,它会自动在具有可执行模式的文本文件上执行自己。 将该设施放入系统中具有以下好处。

[SNIP]

To take advantage of this wonderful opportunity, put

#! /bin/sh

at the left margin of the first line of your shell scripts. Blanks after ! are OK. Use a complete pathname (no search is done). At the moment the whole line is restricted to 16 characters but this limit will be raised.

可以想象,一些后来的类Unix系统支持#!语法但不允许在!后面加空格,但考虑到第一个实现明确允许空格,这似乎是不可能的。

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

更新:

即使在不识别内核的系统上,Perl解释器本身也会识别以#!开头的行。运行perldoc perlrun或参见this web page获取详细信息。

在解析该行时,始终会检查#!行中的开关。因此,如果您在一台只允许带有#!行的一个参数的机器上,或者更糟糕的是,甚至不识别#!行的机器上,您仍然可以获得一致的开关行为,无论如何Perl被调用,即使使用-x找到程序的开头。

Perl还允许在#!之后添加空格。

(个人而言,我更喜欢在#!行中不加空格,但两种方式都可以工作。)

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


感谢给我拓宽视野的机会,Keith。我的 shell 技能还不够好,所以我的假设是基于有限的经验做出的。每天都要学点新东西。 :D - Justin Pearce

10

这似乎通常是双向工作的。看这里。我认为无空格版本现在更为普遍,对我来说也更有吸引力。

顺便提一下,这与Perl没有特定关系(但肯定与编程有关)。


1
那个链接的研究工作非常出色,看了之后你会感到受益匪浅 :) - ikegami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接