什么#!/usr/bin/...在开始的一个文件的意思吗?
-
13-09-2019 - |
题
我可以做这样的事情在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?
谢谢。
解决方案
#!被命名为"家当"而是一个Unix的方式执行的脚本。当你问的操作系统,以执行一个文件,它将图,这不是一个正常的。执行文件,而#!在开始 作为一个神奇的标记指示操作系统执行命令后#!和布了命令所以这个文件将成为一个参数的命令
如果myfile.py 包含
#!/usr/bin/python
执行该文件是不是很不同的运行
$ /usr/bin/python myfile.py
我Haskell知识是穷人。但是为你的特定情况下似乎runghc命令 简单地读取第一线,分析任何上给出的参数,#!行了,写文件的其余部分的临时文件和运行ghc上,临时文件(该文件将具有先留置权剥离出来-看到runghc.hs在ghc来源的更多的信息。)
如果你想做同样的事情与javac你可以用同样的方法作为runghc.写一个包装,那吃的第一线的文件,写文件的其余部分到一个临时文件和运行javac在该文件。
其他提示
如果你的文件是啰。hs,而第一线"#!/usr/bin/runghc",然后壳会执行:
/usr/bin/runghc hello.hs
第一线基本上告诉壳使用什么运行的脚本。
作为java例如第一线应对可执行, 运行 剧本,不是 汇编 脚本。
我的问题是,为什么是第一线的忽视?意见在haskell开始--但是第一线似乎仍然被忽略。它甚至载ghci.的伎俩还与Python和Perl。
'把戏的作品在Python和Perl因为 #
开始一个评论中这些语言,以解释认为该行为的评论,而忽略它。因此,对于他们,这是没有什么特别的。
在Haskell, #
不开始一个评论,因此它通常不会的工作。然而,GHC(或许还有其它的实现,如果我没记错的话,拥抱做的太)具有一种特殊的情况下为家当行。如果第一线的一个文件开始的 #!
, 它被视作一评论。这种偏离的语言规范已被纳入到底要做
$ chmod +x hello.hs
$ ./hello.hs
的工作。它不起作用 javac
因为没有特殊情况下建成对于家当行。
该命令只适用于解释的语言。...这通常意味着没有一个编译器,这将差错出在大多数情况下
原因,这一工作是因为蟒蛇、Perl,显然Haskell,所有解释的语言。这是标准的Unix方式指派口译员,将运行该脚本。Java是编制语言,并且不能够运行一个解释。
Javac是一个编译器,不翻译。
它缺乏互动的模式,我相信是什么导致的"魔法".同样不会的工作与海湾合作委员会,因为它缺少同样的功能。
dmd(D compiler)例如,是一个例子的一个编译器,支持interpertation有这样的互动式编辑(#!/usr/bin/dmd的运行)。
它的位置的可执行的计算机上解释你的脚本。Java是编制语言,因此它不需要这样的声明。
此外,本的一点是,它是一个特殊的意见,该建筑在Java不会是合法的,在这样一个#不是一个法律意见的标记。如果一个建筑就像,将是有意义的...它不...它看起来像:
//!/usr/local/jdk1.6.0_13/bin/javac
发现 这个参考到家当线 通过 维基百科 但 此 似乎是的 更好的文章.也参看 该'#!'神奇的细节约的家当机制的各种Unix味道.