Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 什么是#/usr/bin/。。。在文件的开头是什么意思?_Linux_Command Line_Shebang - Fatal编程技术网

Linux 什么是#/usr/bin/。。。在文件的开头是什么意思?

Linux 什么是#/usr/bin/。。。在文件的开头是什么意思?,linux,command-line,shebang,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给了我一个编译器错误 那么这是如何工作的,我如何让它与J

我可以在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一起工作呢


谢谢。

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

/usr/bin/runghc hello.hs
第一行基本上告诉shell使用什么来运行脚本


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

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

之所以有效,是因为Python、Perl和Haskell,都是解释语言。这是指定将运行脚本的解释器的标准Unix方法。Java是一种编译语言,不能用解释器运行。

Javac是一种编译器,而不是解释器

它缺乏互动模式,我相信这就是造成“魔力”的原因。 由于GCC缺少相同的功能,因此这一点不适用于GCC


例如,dmd(D编译器)就是一个例子,它支持交互式编辑(#!/usr/bin/dmd-run)。它是计算机上用于解释脚本的可执行文件的位置。Java是一种编译语言,因此它不需要这样的语句

此外,重点是它是一个特殊的注释,Java中的构造将不合法,因为#不是合法的注释标记。如果这样的建筑有意义的话。。。但它不。。。它看起来像:

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

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

如果myfile.py包含

#!/usr/bin/python
执行该文件与运行没有太大区别

$ /usr/bin/python myfile.py
我的哈斯克尔知识很差。但对于您的特殊情况,似乎是runghc命令 只需读取第一行,解析在该#上给出的任何参数!行,将文件的其余部分写入临时文件,并在该临时文件上运行ghc(该临时文件将剥离第一个留置权-有关更多信息,请参阅ghc源中的runghc.hs)

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

通过查找找到,但似乎是正确的。另见

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

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

在Haskell中,
#
不会开始注释,因此它通常不起作用。然而,GHC(可能还有其他实现,如果内存可用的话,hugs也这么做了)对于shebang行有一个特殊的情况。如果文件的第一行以
#开头,将其视为注释。这种偏离语言规范的做法正是为了

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

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

文本文件不会成为标准输入。原始命令行(可能在文本文件的名称中添加了路径信息)附加到shebang行上的命令。原始的标准输入仍然是扩展命令的标准输入。但是#foo在Java中是一个注释吗?我知道在*nix上的大多数脚本语言中都是这样(故意这样),这样你就不必担心去掉第一行了。#在Java中不是注释,Java遵循C/C++风格,带有/**/和//comments可能重复的