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 には、これに対する拡張リクエストがあることがわかりました。
これを行う他の方法はありますか?
使用する
//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
ファイルを実行するためのきちんとしたラッパーを提供します。
少しの策略で方法があることがわかりましたが、解釈されたコマンドを完全に抑制することはできませんでしたが、私が望むものにかなり近いです。
変化する 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
しっかりとした答えに触発されて、私はより一般的な解決策を思いつきました
https://Gist.github.com/ffissore/012d7e32a096fde5266f49038c93dcaf
本質的には、jshell-wrapper
はスクリプトの最初の行(Shebangであるはずです)を取り除き、スクリプトの最後に/exit
を追加します