为什么 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 变体的优势在于它提供了调整执行内容的机会,例如向 PATH
或 CLASSPATH
添加元素,或添加选项比如-savecompiled
给解释器(如manual所示)。这可能就是文档建议使用 shell 形式的原因。
我不在 Scala 开发团队,我不知道 Scala 文档的历史动机是什么。
Scala 并不总是支持 /usr/bin/env
。没有特别的原因,只是,我想,编写 shell 脚本支持的人在 00 年代中期并不熟悉这种语法。文档遵循支持的内容,我在某个时候添加了 /usr/bin/env
支持 (iirc),但似乎从来没有费心更改文档。
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 变体的优势在于它提供了调整执行内容的机会,例如向 PATH
或 CLASSPATH
添加元素,或添加选项比如-savecompiled
给解释器(如manual所示)。这可能就是文档建议使用 shell 形式的原因。
我不在 Scala 开发团队,我不知道 Scala 文档的历史动机是什么。
Scala 并不总是支持 /usr/bin/env
。没有特别的原因,只是,我想,编写 shell 脚本支持的人在 00 年代中期并不熟悉这种语法。文档遵循支持的内容,我在某个时候添加了 /usr/bin/env
支持 (iirc),但似乎从来没有费心更改文档。