Как запустить файл JShell?

Я хотел бы запустить весь файл с JShell, например:

$ jshell my-jshell-skript.java

Где, например. содержимое моего my-jshell-skript.java равно 40 + 2;.

Или, альтернативно, исполняемый файл, например:

#!/usr/bin/jshell
40 + 2

Возможно ли это сейчас или мне все еще нужно использовать старый способ вместо Java-Main-Class?

Редактировать 1: Windows-проблема

В Windows для меня все еще нет решения:

C:\JDKs\jdk9.0.0.0_x64\bin>type foo.jsh
1 + 1

C:\JDKs\jdk9.0.0.0_x64\bin>jshell.exe foo.jsh
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro

jshell> /exit
|  Goodbye

C:\JDKs\jdk9.0.0.0_x64\bin>

JShell начинает полностью игнорировать мой файл. Это ошибка?

Редактировать 2: решение проблемы Windows

Оказывается, это содержимое моего файла foo. Похоже, что 1 + 1 работает только "на лету", а не читается из файла:

C:\JDKs\jdk9.0.0.0_x64\bin>type foo.jsh
System.out.println("foo");

C:\JDKs\jdk9.0.0.0_x64\bin>jshell.exe foo.jsh
foo
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro

jshell> /exit
|  Goodbye

C:\JDKs\jdk9.0.0.0_x64\bin>

person user470370    schedule 26.09.2017    source источник
comment
Мужик, это так раздражает. Вся эта шумиха вокруг jshell, и он не может работать jshell helloworld.java.   -  person Sridhar Sarnobat    schedule 17.10.2017


Ответы (7)


JShell не предназначен для прямого запуска класса Java. Если вы хотите запустить java-класс, вам все равно нужно делать это по-старому — java <your-class-name>.

Из документы,

Инструмент Java Shell (JShell) — это интерактивный инструмент для изучения языка программирования Java и создания прототипов кода Java. JShell — это цикл чтения-оценки-печати (REPL), который оценивает объявления, операторы и выражения по мере их ввода и немедленно отображает результаты.

Согласно этой цитате, JShell предназначен для запуска или проверки отдельных операторов Java. В традиционном для Java способе вам нужно написать полную программу на Java, прежде чем вы сможете запустить ее и увидеть результаты. Но JShell позволяет вам опробовать операторы Java без необходимости создания полного автономного приложения Java.

Итак, краткий ответ на ваш вопрос заключается в том, что нет, вы не можете вызывать автономные приложения Java, такие как jshell my-jshell-skript.java. Однако вы МОЖЕТЕ вызвать файл сценария, который содержит отдельные команды JShell или операторы Java. Итак, если вы скопируете все операторы из своей Java-программы и вставите их в сценарий JShell, вы сможете запустить сценарий следующим образом:

% jshell my-jshell-skript.jsh

Но это не совсем то же самое, что запуск автономного Java-приложения.

person VHS    schedule 26.09.2017

Вы можете создать файл Jshell-скрипта с именем some.jsh с эти операторы и в командной строке, откуда вы запускаете jshell, выполните его как: -

jshell /path/to/some.jsh

В MacOSX я бы сделал что-то вроде:

введите описание изображения здесь

person Naman    schedule 26.09.2017
comment
Есть ли способ запретить вход в интерактивный режим после завершения скрипта? - person pnewhook; 20.10.2017
comment
@pnewhook Вы можете использовать /exit внутри скрипта. - person Naman; 21.10.2017

Вы можете передать строку JShell:

echo 1 + 2 | jshell

Пример:

:/# echo 1 + 2 | jshell
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro

jshell> 1 + 2
$1 ==> 3

:/#

Или из файла:

cat myfile | jshell

Где myfile содержит строку "1+2".

person Maroun    schedule 26.09.2017
comment
Это не работает в Cygwin: ``` peter@AB4745 /cygdrive/c/JDKs/jdk9.0.0.0_x64/bin $ echo 2 + 3 | jshell.exe | Добро пожаловать в JShell -- Версия 9 | Для вводного типа: /help intro jshell› ``` - person user470370; 26.09.2017

Запустите jshell в режиме обратной связи concise и отфильтруйте нужный контент-

$echo '40 + 2' | jshell --feedback concise | sed -n '2p' |sed -En 's/[^>]*>(.+)/\1/gp'

вывод: 42

Подробнее здесь- ">Как выполнить команду java jshell как встроенную из оболочки или командной строки Windows

person Rahul Sharma    schedule 14.10.2017

В jshell вы можете сохранить текущие фрагменты в файл, выполнив:

/save Filename

Точно так же вы можете загрузить файл в текущий контекст/сеанс, выполнив:

/open Filename

Вот один из таких примеров:

|  Welcome to JShell -- Version 9.0.7.1
|  For an introduction type: /help intro

jshell> String[] names={"nameone","nametwo"}
names ==> String[2] { "nameone", "nametwo" }

jshell> Arrays.toString(names);
$2 ==> "[nameone, nametwo]"

jshell> /save myExample

jshell> %                                                                                                                                             sudipbhandari at sysadm-Latitude-5480 in ~                                                                                                      18:22
> jshell
|  Welcome to JShell -- Version 9.0.7.1
|  For an introduction type: /help intro

jshell> names
|  Error:
|  cannot find symbol
|    symbol:   variable names
|  names
|  ^---^

jshell> /open myExample

jshell> names
names ==> String[2] { "nameone", "nametwo" }
person Sudip Bhandari    schedule 06.07.2018

В Windows, чтобы просмотреть подробный вывод для файла jsh

type file.jsh | jshell -v

Проблема при запуске jshell file.jsh

D:\>type file.jsh
3 + 5

D:\>jshell file.jsh
|  Welcome to JShell -- Version 13.0.2
|  For an introduction type: /help intro

jshell>

Обходной путь:

D:\>type file.jsh
3 + 5

D:\>type file.jsh | jshell -v
|  Welcome to JShell -- Version 13.0.2
|  For an introduction type: /help intro

jshell> $1 ==> 8
|  created scratch variable $1 : int

jshell>

Примечание: файл должен содержать пустую строку (/n) после последней строки, иначе последняя строка не будет выполнена.

person Senthil    schedule 20.01.2020

Использование конвейера может быть достигнуто с помощью параметра дефиса, отсутствующего в первоначальном выпуске jshell.

echo 'System.out.print(1 + 2)' | jshell -

https://docs.oracle.com/en/java/javase/11/tools/jshell.html
https://bugs.openjdk.java.net/browse/JDK-8187439

person user9999    schedule 30.11.2020