Luc*_*cky 16 linux command-line shebang
我可以在Haskell中做这样的事情:
#!/usr/bin/runghc
main=putStrLn "Hello World"
Run Code Online (Sandbox Code Playgroud)
然后我可以运行它 ./hello.hs
我的问题是,为什么忽略第一行?haskell中的注释开头,--
但第一行似乎仍然被忽略.它甚至加载到ghci.这个技巧也适用于Python和Perl.
但是当我在Java中做类似的事情:
#!/usr/local/jdk1.6.0_13/bin/javac
...
Run Code Online (Sandbox Code Playgroud)
Javac给了我一个编译器错误.
那么这是如何工作的呢?我将如何使用Java?
谢谢.
nos*_*nos 18
#!被命名为" shebang ",是一种执行脚本的Unix方式.当你要求操作系统执行一个文件时,它会发现这不是一个普通的.exe文件,而是#!在开始时充当魔术标记,指示操作系统在#!之后执行命令!并连接该命令,以便该文件成为该命令的参数
如果myfile.py包含
#!/usr/bin/python
Run Code Online (Sandbox Code Playgroud)
执行该文件与运行没有太大区别
$ /usr/bin/python myfile.py
Run Code Online (Sandbox Code Playgroud)
我的Haskell知识很差.但是对于你的特殊情况,似乎runghc命令只是读取第一行,解析在#上给出的任何参数!line,将文件的其余部分写入临时文件并在该临时文件上运行ghc(这将剥夺第一个留置权 - 请参阅ghc源中的runghc.hs以获取更多信息.)
如果你想用javac做同样的事情,你可以使用与runghc相同的方法.编写一个包装器,它占用文件的第一行,将文件的其余部分写入临时文件并在该文件上运行javac.
如果你的文件是hello.hs,第一行是"#!/ usr/bin/runghc",那么shell将执行:
/usr/bin/runghc hello.hs
Run Code Online (Sandbox Code Playgroud)
第一行基本上告诉shell使用什么来运行脚本.
至于java示例,第一行应该是运行脚本的可执行文件,而不是编译脚本.