为什么 Scala 使用反向 shebang (!#) 而不是仅仅将解释器设置为 scala

Why does Scala use a reversed shebang (!#) instead of just setting interpreter to scala

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

#!/bin/sh
exec scala "[=10=]" "$@"
!#
/* Script here */

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

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

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

据我通过快速测试可以看出,它做的事情完全相同,但不那么冗长。

文档有多旧?通常,这种东西(通常称为 'the exec hack')在 /bin/env 流行之前就已被推荐,这是获得该功能的最佳方式。请注意,/usr/bin/env/bin/env 更常见,应该改为使用。

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

使用中间 shell 而不是 /usr/bin/env 没有任何好处,除了 运行 在一些罕见的古董 Unix 变体中 env 不在 /usr/bin。好吧,从技术上讲,SCO 仍然存在,但 Scala 甚至 运行 存在吗?

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

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

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