什么是#!(砰磅)在sh /的Bash shell脚本的含义是什么?(What is the mea

2019-07-28 20:29发布

我想了解这个斯卡拉脚本是如何工作的:

#!/usr/bin/env bash
exec scala "$0" "$@"
!#
object HelloWorld {
    def main(args: Array[String]) {
        println("Hello, world! " + args.toList)
    }   
}
HelloWorld main args

在第3行,什么是“#!”在干什么? 在文件的剩余部分,然后输送到标准输入 Scala的计划? 还有,就是“!#”记载地方?

注:我能找到的,虽然它不是直接相关的以任何方式最近的事情是堆栈溢出问题, 为什么你需要把#/斌/庆典在脚本文件的开头!? (约一开始的Bash脚本)。

Answer 1:

从原来的文件 :

脚本文件可能有如果存在被忽视的可选头。 有两种方法来格式化标题:要么以#开始! 并用!#结尾,或::#开始! 与::!#结束。

所以下面的代码仅仅是一个斯卡拉脚本头:

#!/usr/bin/env bash
exec scala "$0" "$@"
!#


Answer 2:

当我删除!#在样本程序BluesRockAddict的答案 ,我会在控制台以下错误:

错误:脚本文件不以#关闭其头部或::#一个发现错误!

从上面的错误消息,我明白了以下几件事:

  1. !#是标题中的关闭标记exec scala "$0" "$@" ,这可能会告诉斯卡拉,无论来自后!#是要执行的Scala代码。
  2. !#可以替换为::!#


Answer 3:

纯粹基于实验(我想这是什么地方描述):

使用Scala 2.10.0开始,非标(从POSIX脚本POV)磅感叹号(!#)在POSIX shell环境不再需要。 下面一行的作品(但必须在脚本的第一行,没有前导空格):

#!/usr/bin/env scala

然而,为了提供一个窗口批处理文件认领的唯一方法是将其诱骗到与自身调用斯卡拉作为第一个参数。 因此,斯卡拉需要知道批处理文件的最后一行,因此要求关闭::#!行。 这里有一个工作示例:

::#!
call scala %0 %*
goto :eof
::!#

更正:我本来#在/ usr / bin中/ env的scalav(注意尾随V),这是我的脚本,定义属性“scala.script”,添加一些库到类路径中,前“EXEC阶”本身。 这样,有可能确定正在执行的脚本的名称,但必须scalav然后在您的PATH。



文章来源: What is the meaning of !# (bang-pound) in a sh / Bash shell script?