#!/path/...
#! /path/...
什么是正确的?这重要吗?有历史吗?
我听说过一种古老版本的Unix需要没有空格。但后来我听说那只是一个谣言。有人能确定吗?
编辑:我想不出更好的地方来问这个问题。它与编程有关,因为空格可能会使程序以不同的方式运行,我不知道。因此我在这里问了这个问题。
#!
语法是在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上进行了讨论。)
这似乎通常是双向工作的。看这里。我认为无空格版本现在更为普遍,对我来说也更有吸引力。
顺便提一下,这与Perl没有特定关系(但肯定与编程有关)。
cp
用法的问题一样。(好吧,perl
解析它以支持不支持#!
的系统。例如,将带有#!/usr/bin/python
的文件传递给perl
,它将启动python
。例如,将带有#!/usr/bin/perl -w
的文件传递给perl
,即使没有使用#!
行来启动脚本,它也会打开警告。Perl不在乎#!
后面是否有空格。) - ikegami