2017-07-05 2 views
13

Vorausgesetzt, dass Java 9 auf uns ist und wir endlich eine Java-REPL mit jshell haben kann, hatte ich gehofft, es gab eine Möglichkeit, einen Shebang zu einem Skript hinzufügen und jshell interpretieren.Wie führe ich ein Java Script mit jshell aus?

versuchte ich test.jsh erstellen:

#!/usr/bin/env jshell -s 
System.out.println("Hello World") 
/exit 

Wie dem auch gibt:

⚡ ./test.jsh 
| Error: 
| illegal character: '#' 
| #!/usr/bin/env jshell -s 
|^
| Error: 
| illegal start of expression 
| #!/usr/bin/env jshell -s 
| ^
Hello World 

Es stellt sich heraus, es ist eine Erweiterung Anfrage dies in OpenJDK https://bugs.openjdk.java.net/browse/JDK-8167440.

Gibt es eine andere Möglichkeit, dies zu tun?

Antwort

12

Verwenden

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

als die erste Zeile von test.jsh:

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

Was uns gibt. Das test.jsh Skript könnte wie folgt aussehen:

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

die Befehlszeile Option --show-version optional ist, natürlich, gibt aber ein unmittelbares Feedback, dass Werkzeug

Die zusätzliche Befehlszeilenoption eines anderen --execution local verhindert jshell zum Laichen läuft VM. Dies beschleunigt die Startzeit und wenn eine Ausnahme durch Ihren Skriptcode ausgelöst wird, wird die lokale VM beendet.

Weitere Informationen finden Sie in den Ausgaben jshell --help und jshell --help-extra.

+1

Wie funktioniert das überhaupt? Ich frage mich, wie tragbar das ist. Zugegeben, "#!" Ist sowieso kein Standard-POSIX, aber sicher, was magische Zahlen angeht, wäre es das am weitesten verbreitete. – Steiny

+2

Mindestens 'bash' unterstützt die ursprüngliche' // 'Zeile. Siehe diesen Thread für Details http://mail.openjdk.java.net/pipermail/kulla-dev/2016-October/thread.html#1679 ... mit Brian Goetz, der besagt, dass die Erstellung einer '.jsh' Datei ausführbar ist versuchen, jshell in etwas zu verwandeln, für das es nicht bestimmt war. _ – Sormuras

+0

> _Wie funktioniert das überhaupt? _ Sehen Sie die Beschreibung des "Hacks" an Abschnitt _ "Imitieren Sie den Shebang über Bash" _ bei http: // golangcookbook.com/chapters/running/shebang/ – Sormuras

2

Es stellt sich heraus, dass es mit ein bisschen Tricks einen Weg gibt, obwohl ich es nicht vollständig geschafft habe, die interpretierten Befehle zu unterdrücken, aber ziemlich nahe an dem was ich will.

ändern test.jsh zu:

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