web-dev-qa-db-ja.com

jshellでJavaスクリプトを実行する方法は?

Java 9が私たちにあり、最終的にJava REPL with jshell Iスクリプトにシバンを追加して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-816744 には、これに対する拡張リクエストがあることがわかりました。

これを行う他の方法はありますか?

22
steinybot

使用する

//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

コマンドラインオプション--show-versionはもちろんオプションですが、ツールが実行中であることを即座にフィードバックします。

extraコマンドラインオプション--execution localは、jshellが別のVMを起動できないようにします。これにより起動時間が短縮され、スクリプトコードによって例外がスローされた場合、ローカルVMが終了します。

その他のオプションについては、jshell --helpおよびjshell --help-extraの出力を参照してください。

更新

https://github.com/maxandersen/jbangもご覧くださいJavaスクリプト、コマンドラインから.Javaファイルを実行するためのきちんとしたラッパーを提供します。

23
Sormuras

少しの策略で方法があることがわかりましたが、解釈されたコマンドを完全に抑制することはできませんでしたが、私が望むものにかなり近いです。

変化する test.jshから:

#!/usr/bin/env sh
tail -n +4 "$0" | jshell -s "$@"
exit $?
System.out.println("Hello World")
/exit

それは私たちに与えます:

⚡ ./test.jsh
-> System.out.println("Hello World")
Hello World
-> /exit
4
steinybot

しっかりとした答えに触発されて、私はより一般的な解決策を思いつきました

https://Gist.github.com/ffissore/012d7e32a096fde5266f49038c93dcaf

本質的には、jshell-wrapperはスクリプトの最初の行(Shebangであるはずです)を取り除き、スクリプトの最後に/exitを追加します

2