#!/ usr / bin / ...在文件开头是什么意思?

时间:2009-07-14 00:04:27

标签: linux command-line shebang

我可以在Haskell中做这样的事情:

#!/usr/bin/runghc
main=putStrLn "Hello World"

然后我可以使用./hello.hs

运行它

我的问题是,为什么忽略第一行? haskell中的注释以--开头,但第一行似乎仍被忽略。它甚至加载到ghci。这个技巧也适用于Python和Perl。

但是当我在Java中做类似的事情时:

#!/usr/local/jdk1.6.0_13/bin/javac
...

Javac给我一个编译器错误。

那么这是如何工作的呢?我将如何使用Java?

感谢。

8 个答案:

答案 0 :(得分:17)

#!被命名为“shebang”,是一种执行脚本的Unix方式。当你要求操作系统执行一个文件时,它会发现这不是一个普通的.exe文件,而是#!在开始时 作为魔术标记,指示操作系统在#后执行命令!并连接该命令,以便该文件成为该命令的参数

如果myfile.py包含

#!/usr/bin/python

执行该文件与运行

没有什么不同
$ /usr/bin/python myfile.py

我的Haskell知识很差。但是对于你的特殊情况,似乎是runghc命令 只需读取第一行,解析在#上给出的任何参数! line,将文件的其余部分写入临时文件并在该临时文件上运行ghc(这将删除第一个留置权 - 请参阅ghc源中的runghc.hs以获取更多信息。)

如果你想用javac做同样的事情,你可以使用与runghc相同的方法。 编写一个包装器,它占用文件的第一行,将文件的其余部分写入临时文件并在该文件上运行javac。

答案 1 :(得分:5)

如果你的文件是hello.hs,第一行是“#!/ usr / bin / runghc”,那么shell将执行:

/usr/bin/runghc hello.hs

第一行基本上告诉shell使用什么来运行脚本。

对于java示例,第一行应该是运行脚本的可执行文件,而不是编译脚本。

答案 2 :(得分:2)

  

我的问题是,为什么忽略第一行? haskell中的注释以 - 但第一行似乎仍被忽略。它甚至加载到ghci。这个技巧也适用于Python和Perl。

'技巧'适用于Python和Perl,因为#在这些语言中启动注释,因此解释器将该行视为注释而忽略它。所以对他们来说,没什么特别的。

在Haskell中,#没有开始评论,所以通常不会起作用。然而,GHC(也许还有其他实现,如果内存服务,拥抱也是如此)对shebang线有一个特例。如果文件的第一行以#!开头,则将其视为注释。这种与语言规范的偏差已完全合并到

$ chmod +x hello.hs
$ ./hello.hs

的工作。它不适用于javac,因为shebang行没有内置特殊情况。

答案 3 :(得分:1)

shebang只适用于解释型语言....它通常对编译器没有任何意义,在大多数情况下都会出错

答案 4 :(得分:0)

这样做的原因是因为Python,Perl和显然是Haskell都是解释语言。它是指定将运行脚本的解释器的标准Unix方法。 Java是一种编译语言,无法使用解释器运行。

答案 5 :(得分:0)

Javac是编译器,而不是解释器。

它缺乏交互模式,我认为这是导致'魔术'的原因。 由于缺少相同的功能,因此GCC也无法使用。

例如, dmd(D编译器)是支持插入的编译器的一个示例,具有这种交互式编辑(#!/ usr / bin / dmd -run)。

答案 6 :(得分:0)

这是计算机上可执行文件的位置,用于解释您的脚本。 Java是一种编译语言,因此它不需要这样的语句。

此外,重点是它是一个特殊的评论,Java的构造在这方面是不合法的,因为#不是合法的评论标记。如果这样的结构有意义......它不会......它看起来像:

//!/usr/local/jdk1.6.0_13/bin/javac

答案 7 :(得分:0)