【问题标题】:What is the meaning of !# (bang-pound) in a sh / Bash shell script?sh / Bash shell 脚本中的 !# (bang-pound) 是什么意思?
【发布时间】:2012-04-08 04:39:21
【问题描述】:

我想了解这个 Scala 脚本是如何工作的:

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

在第 3 行,“!#”在做什么?然后将文件的其余部分馈送到 Scala 程序的standard input 吗?另外,'!#' 是否记录在任何地方?

注意:我能找到的最接近的东西是 Stack Overflow 问题,尽管它与任何方式都没有直接关系Why do you need to put #!/bin/bash at the beginning of a script file?(关于 Bash 脚本的开头)。

【问题讨论】:

标签: bash shell scala command-line


【解决方案1】:

来自the original documentation

脚本文件可能有一个可选的标头,如果存在则被忽略。有两种方式来格式化标题:要么以#开头!并以 !# 结尾,或以 ::# 开头!并以 ::!# 结尾。

所以以下代码只是 Scala 脚本的标头:

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

【讨论】:

  • 不错。那么“!#”之后的脚本内容会发生什么?
  • Scala 运行它。内置的exec 导致scala 解释器替换 shell,因此bash 永远不会看到!# 行。而scala 将忽略#!!# 之间的所有内容。
  • 我认为它可能是这样工作的,但我在任何地方都找不到它的文档。谢谢!
【解决方案2】:

当我在BluesRockAddict's answer 的示例程序中删除!# 时,控制台出现以下错误:

错误:脚本文件没有用 !# 或 ::!# 关闭其标题 发现一个错误

从上面的错误信息中,我明白了以下几点:

  1. !# 是标题 exec scala "$0" "$@" 的结束标记,它可能告诉 Scala !# 之后的任何内容都是要执行的 Scala 代码。
  2. !# 可以替换为 ::!#

【讨论】:

    【解决方案3】:

    纯粹基于实验(我假设这在某处有所描述):

    从 Scala 2.10.0 开始,在 POSIX shell 环境中不再需要非标准(来自 POSIX 脚本 POV)的 pound-bang (!#)。以下单行有效(但必须是脚本的第一行,没有前导空格):

    #!/usr/bin/env scala
    

    但是,在 Windows 批处理文件中提供 shebang 的唯一方法是欺骗它以自身作为第一个参数调用 Scala。因此,Scala 需要知道批处理文件的最后一行在哪里,因此需要关闭 ::!# 行。这是一个工作示例:

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

    更正:我最初有 #!/usr/bin/env scalav(注意尾随的 v),这是我定义属性“scala.script”的脚本,在“exec scala”本身之前将一些库添加到类路径中.这样就可以确定正在执行的脚本的名称,尽管 scalav 必须在您的 PATH 中。

    【讨论】:

      猜你喜欢
      • 2011-11-14
      • 1970-01-01
      • 2012-04-19
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多