我可以在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?
感谢。
答案 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也无法使用。
例如,答案 6 :(得分:0)
这是计算机上可执行文件的位置,用于解释您的脚本。 Java是一种编译语言,因此它不需要这样的语句。
此外,重点是它是一个特殊的评论,Java的构造在这方面是不合法的,因为#不是合法的评论标记。如果这样的结构有意义......它不会......它看起来像:
//!/usr/local/jdk1.6.0_13/bin/javac
答案 7 :(得分:0)