【问题标题】:Why does Scala use a reversed shebang (!#) instead of just setting interpreter to scala为什么 Scala 使用反向 shebang (!#) 而不仅仅是将解释器设置为 scala
【发布时间】:2015-05-01 21:26:40
【问题描述】:

scala文档显示创建scala脚本的方式是这样的:

#!/bin/sh
exec scala "$0" "$@"
!#
/* Script here */

我知道这会使用脚本文件的名称和传递给它的参数执行 scala,并且 scala 命令显然知道读取这样开始的文件并忽略所有内容,直到反向 shebang !#

我的问题是:有什么理由我应该为 scala 脚本使用这种(相当冗长的)格式,而不仅仅是:

#!/bin/env scala
/* Script here */

据我通过快速测试可以看出,这完全一样,但不那么冗长。

【问题讨论】:

  • 我唯一得到的是它显然更灵活,并且可以让您在脚本启动之前设置环境变量(例如_JAVA_OPTIONS)。

标签: bash scala sh


【解决方案1】:

文档有多久了?通常,在/bin/env 很常见之前就推荐了这种东西(通常称为“执行黑客”),这是获得该功能的最佳方式。请注意,/usr/bin/env/bin/env 更常见,应改为使用。

【讨论】:

  • 这在旧文档和当前文档中都有。 scala-lang.org/documentation/getting-started.html
  • 在 Scala 被发明的时候,/usr/bin/env(是/usr/bin/env,而不是/bin/env)已经稳固建立了十多年,我怀疑是否有任何平台可以让 Scala 和 shebang 工作但不是/usr/bin/env
  • @Giles /bin/env 很常见(事实上,尽管 Linux 标准化了 /usr/bin/env,但在 Red Hat 上 /usr/bin/env 是指向 /bin/env 的符号链接,或者至少是我最后一次看过),但由于 OP 提到了/bin/env,所以谈论/usr/bin/env 毫无意义。
  • @Gilles env 是在 1994 年的 4.4 BSD 中引入的。不过,GNU 的版权可以追溯到 2010 年。
  • 我的系统上没有/bin/env(它是/usr/bin/env,并且没有符号链接)。
【解决方案2】:

请注意,它是/usr/bin/env,而不是/bin/env

使用中间 shell 代替 /usr/bin/env 没有任何好处,除了在一些罕见的老式 Unix 变体中运行,其中 env 不在 /usr/bin 中。好吧,从技术上讲,SCO 仍然存在,但 Scala 甚至可以在那里运行吗?

然而,shell 变体的优势在于它提供了调整执行内容的机会,例如向PATHCLASSPATH 添加元素,或向解释器添加诸如-savecompiled 之类的选项(如显示在manual)。这可能是文档建议使用 shell 形式的原因。

我不是 Scala 开发团队的成员,我不知道 Scala 文档的历史动机是什么。

【讨论】:

  • 在哪个 bin env 上的迂腐与问题无关,因为某些系统配置其bins 的方式不同,而这个问题与此无关。有关可以在专用变体中完成的其他配置的信息很有用。
【解决方案3】:

Scala 并不总是支持/usr/bin/env。没有特别的原因,只是,我想,写 shell 脚本支持的人不熟悉那种语法,早在 00 年代中期。文档遵循受支持的内容,我在某个时候添加了 /usr/bin/env 支持 (iirc),但似乎从不费心更改文档。

【讨论】:

    猜你喜欢
    • 2017-02-27
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2012-08-26
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多