Как выполнить 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.
Есть ли другой способ сделать это?
Ответы
Ответ 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