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

标签 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 一起工作?

谢谢。

最佳答案

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

如果 myfile.py 包含

#!/usr/bin/python

执行那个文件和运行没有太大区别

$ /usr/bin/python myfile.py

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

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

关于linux - 文件开头的 #!/usr/bin/... 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1122778/

相关文章:

command-line - azure devops 本地代理管道权限被拒绝

c - C 源代码/脚本/程序是否使用类似 shebang 的命令?

python - shebang 无法在 WSL(Windows 子系统 Linux)上工作

node.js - 我正在学习 shebangs。如何让它在 Mac 终端中与 node.js 一起工作?

c - 在 Linux 上从消息队列读取时出现错误 "Bad address"

linux - 每秒显示运行 bash 脚本的运行时间

linux - 第一个变量被 shell 脚本中的第二个变量覆盖

linux - 复制文件及其(最后)文件夹

mysql - 批处理文件创建用户,然后用mysql分配权限

bash - 相当于 `getrusage()` 的命令行