如何用jshell执行java脚本?

ste*_*bot 20 java shebang java-9 jshell

鉴于Java 9已经出现在我们身上,我们终于可以拥有一个java REPL了,jshell我希望有一种方法可以将一个shebang添加到脚本中并对其进行jshell解释.

我尝试创建test.jsh:

#!/usr/bin/env jshell -s
System.out.println("Hello World")
/exit
Run Code Online (Sandbox Code Playgroud)

然而,这给了:

? ./test.jsh
|  Error:
|  illegal character: '#'
|  #!/usr/bin/env jshell -s
|  ^
|  Error:
|  illegal start of expression
|  #!/usr/bin/env jshell -s
|    ^
Hello World
Run Code Online (Sandbox Code Playgroud)

事实证明,在OpenJDK https://bugs.openjdk.java.net/browse/JDK-8167440中有一个增强请求.

有没有其他方法可以做到这一点?

Sor*_*ras 21

使用

//usr/bin/env jshell --show-version --execution local "$0" "$@"; exit $?

作为第一行test.jsh.该test.jsh脚本可能如下所示:

//usr/bin/env jshell --show-version "$0" "$@"; exit $?
System.out.println("Hello World")
/exit
Run Code Online (Sandbox Code Playgroud)

--show-version当然,命令行选项是可选的,但会立即反馈工具正在运行

额外的命令行选项--execution local阻止jshell产卵另一个VM.这会加快启动时间,如果脚本代码抛出异常,则本地VM将退出.

查阅输出jshell --helpjshell --help-extra更多选项.

  • 至少`bash`支持初始`//`行.有关详细信息,请参阅此主题http://mail.openjdk.java.net/pipermail/kulla-dev/2016-October/thread.html#1679 ...与Brian Goetz说明制作`.jsh`文件的可执行文件_是试图将jshell变成不适合的东西._ (2认同)

ste*_*bot 6

事实证明,有一点技巧,有一种方法,虽然我还没有完全设法抑制解释的命令,但非常接近我想要的。

\n\n

改成test.jsh

\n\n
#!/usr/bin/env sh\ntail -n +4 "$0" | jshell -s "$@"\nexit $?\nSystem.out.println("Hello World")\n/exit\n
Run Code Online (Sandbox Code Playgroud)\n\n

这给了我们:

\n\n
\xe2\x9a\xa1 ./test.jsh\n-> System.out.println("Hello World")\nHello World\n-> /exit\n
Run Code Online (Sandbox Code Playgroud)\n