2017-07-05 17 views
13

Cho rằng Java 9 là khi chúng tôi và cuối cùng chúng tôi có thể có một REPL java với jshell Tôi đã hy vọng có một cách để thêm một shebang vào một kịch bản và có jshell giải thích nó.Làm thế nào để thực hiện một kịch bản java với jshell?

tôi đã cố gắng tạo test.jsh:

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

Tuy nhiên cung cấp cho:

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

Hóa ra có một yêu cầu tăng cường cho điều này trong OpenJDK https://bugs.openjdk.java.net/browse/JDK-8167440.

Có cách nào khác để thực hiện việc này không?

Trả lời

12

Sử dụng

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

như dòng đầu tiên của test.jsh. Các kịch bản test.jsh có thể trông giống như:

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

các tùy chọn dòng lệnh --show-version là không bắt buộc, tất nhiên, nhưng cung cấp cho thông tin phản hồi ngay lập tức rằng công cụ đang chạy

các thêm dòng lệnh tùy chọn --execution local ngăn jshell để đẻ trứng khác VM. Điều này tăng tốc thời gian khởi động và nếu một ngoại lệ được ném bởi mã script của bạn, máy ảo cục bộ sẽ thoát.

Tham khảo kết quả của jshell --helpjshell --help-extra để có thêm tùy chọn.

+1

Tính năng này hoạt động như thế nào? Tôi tự hỏi làm thế nào di động này được. Cấp rằng '#!' Không phải là tiêu chuẩn POSIX anyway nhưng chắc chắn như xa như số ma thuật đi nó sẽ được áp dụng rộng rãi nhất. – Steiny

+2

Ít nhất 'bash' hỗ trợ dòng inital' // '. Xem chủ đề này để biết chi tiết http://mail.openjdk.java.net/pipermail/kulla-dev/2016-October/thread.html#1679 ... với Brian Goetz nói rằng việc tạo tệp '.jsh' có thể thực thi được là cố gắng biến jshell thành thứ gì đó mà nó không được thiết kế cho._ – Sormuras

+0

> _Cách này có thể hoạt động như thế nào? _ Xem mô tả về "hack" tại phần _ "Bắt chước shebang qua Bash" _ tại http: // golangcookbook.com/chương/chạy/shebang/ – Sormuras

2

Nó chỉ ra rằng với một chút thủ đoạn có một cách, mặc dù tôi đã không hoàn toàn quản lý để ngăn chặn các lệnh giải thích nhưng khá gần với những gì tôi muốn.

Thay đổi test.jsh tới:

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

nào cho chúng ta:

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

Lấy cảm hứng từ câu trả lời steiny, tôi đã đưa ra một giải pháp chung chung hơn

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

Về bản chất: jshell-wrapper sẽ dải dòng đầu tiên của kịch bản (mà được coi là những công việc) và sẽ bổ sung a /exit ở cuối tập lệnh

Các vấn đề liên quan