from - java execute command linux
¿Cómo ejecutar un script java con jshell? (3)
Dado que Java 9 está sobre nosotros y finalmente podemos tener un REPL de java con jshell
, esperaba que hubiera una manera de agregar un shebang a un script y que jshell
interpretara.
Intenté crear test.jsh
:
#!/usr/bin/env jshell -s
System.out.println("Hello World")
/exit
Sin embargo eso da:
⚡ ./test.jsh
| Error:
| illegal character: ''#''
| #!/usr/bin/env jshell -s
| ^
| Error:
| illegal start of expression
| #!/usr/bin/env jshell -s
| ^
Hello World
Resulta que hay una solicitud de mejora para esto en OpenJDK https://bugs.openjdk.java.net/browse/JDK-8167440 .
Hay alguna otra manera de hacer esto?
Inspirado por la respuesta inteligente, se me ocurrió una solución más genérica.
https://gist.github.com/ffissore/012d7e32a096fde5266f49038c93dcaf
En esencia: jshell-wrapper
eliminará la primera línea del script (que se supone que es el shebang) y agregará /exit
al final del script
Resulta que con un poco de engaño hay una manera, aunque no he logrado suprimir completamente los comandos interpretados, pero sí lo bastante parecido a lo que quiero.
Cambie test.jsh
a:
#!/usr/bin/env sh
tail -n +4 "$0" | jshell -s "$@"
exit $?
System.out.println("Hello World")
/exit
Lo que nos da:
⚡ ./test.jsh
-> System.out.println("Hello World")
Hello World
-> /exit
Utilizar
//usr/bin/env jshell --show-version --execution local "$0" "$@"; exit $?
como la primera línea de test.jsh
. El script test.jsh
podría verse como:
//usr/bin/env jshell --show-version "$0" "$@"; exit $?
System.out.println("Hello World")
/exit
La opción de la línea de comando --show-version
es opcional, por supuesto, pero proporciona una respuesta inmediata de que la herramienta está funcionando
La opción de línea de comando adicional --execution local
evita que jshell
otra VM. Esto acelera el tiempo de inicio y, si el código del script lanza una excepción, la máquina virtual local se cerrará.
Consulte la salida de jshell --help
y jshell --help-extra
para obtener más opciones.