我已经使用 shebang #!
一段时间了,今天遇到了一个让我困惑的用例。
有几种方法可以运行 Scala 脚本,比如:
#!/usr/bin/env scala
println("hello world")
不过,我遇到了这个版本的 shebang
#!/bin/sh
exec scala "$0" "$@"
!#
println("hello world")
看起来这个解决方案基本上首先调用bash,然后运行 exec scala "$0" "$@"
,其中$0
表示当前文件名,$@
是一个位置数组中的输入参数。
我的问题是,这是否意味着在#!
和!#
之间的所有内容都可以在bash中执行?
#!/bin/sh
exec scala "$0" "$@"
echo "oh Yeah"
!#
println("hello world")
它没有报错,但标准输出没有显示 "oh Yeah",有人能解释一下这里发生了什么吗?
更新:在意识到 !#
是 scala 的东西之后,我下载了 scala 的源代码并意识到它只出现在由 Lex Spoon 编写的 ScriptRunner.scala 部分的注释中。
exec
用新进程替换当前进程,执行完exec
后之后的代码不会再执行。 - Etan Reisnerprintln()
而不是echo
开始,这就是!#
用于的地方吗? - B.Mr.W.exec
之前放置echo
,则可能会使其出现。Perl 在perldoc perlrun
中记录了一些相关的符号。 - Jonathan Leffler