考虑到Java9即将推出,我们终于可以用jshell
来实现java REPL,我希望有一种方法可以向脚本添加一个shebang,并让jshell
来解释它。
我尝试创建test.jsh
:
#!/usr/bin/env jshell -s
System.out.println("Hello World")
/exit
然而,这给出:
⚡ ./test.jsh
| Error:
| illegal character: '#'
| #!/usr/bin/env jshell -s
| ^
| Error:
| illegal start of expression
| #!/usr/bin/env jshell -s
| ^
Hello World
原来OpenJDK https://bugs.openjdk.java.net/browse/JDK-8167440中对此有一个增强请求。
有没有别的办法?
4条答案
按热度按时间mbyulnm01#
用途
//usr/bin/env jshell --show-version --execution local "$0" "$@"; exit $?
作为
test.jsh
的第一行。test.jsh
脚本可能如下所示:当然,命令行选项
--show-version
是可选的,但它会立即给出工具正在运行的反馈。--execution local
可防止jshell
衍生另一个VM。这将加快启动时间,并且如果脚本代码引发异常,本地VM将退出。有关更多选项,请参阅
jshell --help
和jshell --help-extra
的输出。还可以看一下https://github.com/jbangdev/jbang * 享受Java脚本编写的乐趣 *,它提供了一个从命令行运行
.java
文件的简洁 Package 器。lpwwtiir2#
事实证明,用一点技巧是有办法的,虽然我还没有完全设法抑制解释的命令,但相当接近我想要的。
将
test.jsh
更改为:这就给了我们:
axzmvihb3#
在steiny答案的启发下,我想出了一个更通用的解决方案
https://gist.github.com/ffissore/012d7e32a096fde5266f49038c93dcaf
实质上:
jshell-wrapper
将去掉脚本的第一行(应该是shebang),并在脚本的末尾添加/exit
xxe27gdn4#
下面的也可以;将其放入
someScript.jsh
文件中,并使用./someScript.jsh
运行它。someScript.jsh
收到的所有参数将转到String[] args
。Package 类的使用,这里是
X
,是一个强制性的技巧,通过修改/home/gigi/.sdkman/candidates/java/current/bin/java
来使用您现有的Java版本。灵感来自https://blog.codefx.org/java/scripting-java-shebang/。