Подтвердить что ты не робот

Как выполнить java script с помощью jshell?

Учитывая, что Java 9 на нас, и мы можем, наконец, иметь java REPL с jshell Я надеялся, что есть способ добавить shebang к script и иметь 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.

Есть ли другой способ сделать это?

4b9b3361

Ответ 1

Использование

//usr/bin/env jshell --show-version --execution local "$0" "[email protected]"; exit $?

в качестве первой строки test.jsh. test.jsh script может выглядеть так:

//usr/bin/env jshell --show-version "$0" "[email protected]"; exit $?
System.out.println("Hello World")
/exit

Опция командной строки --show-version, конечно же, является необязательной, но дает немедленную обратную связь, что инструмент работает

Дополнительная опция командной строки --execution local предотвращает появление jshell другой виртуальной машины. Это ускоряет время запуска, и если исключение вызывается кодом script, локальная виртуальная машина будет завершена.

Обратитесь к выводам jshell --help и jshell --help-extra для получения дополнительных параметров.

Ответ 2

Оказывается, что с небольшим количеством обмана есть способ, хотя мне не удалось полностью подавить интерпретируемые команды, но довольно близко к тому, что я хочу.

Измените test.jsh на:

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

Что дает нам:

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

Ответ 3

Вдохновленный верным ответом, я придумал более общее решение

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

В сущности: jshell-wrapper разделит первую строку script (которая должна быть shebang) и добавит a /exit в конец script