如何 运行 一个 JShell 文件?

How to run a JShell File?

我想用 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 只工作 "on the fly",而不是从文件中读取:

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>

您可以将字符串通过管道传输到 JShell:

echo 1 + 2 | jshell

示例:

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

jshell> 1 + 2
 ==> 3

:/#

或者,从文件中:

cat myfile | jshell

其中 myfile 包含行“1 + 2”。

您可以使用这些语句创建一个名为 some.jshJshell script 文件,然后在 运行 jshell 的命令提示符下执行它:-

jshell /path/to/some.jsh

在 MacOSX 上,我会做类似的事情:

JShell 并不意味着直接 运行 一个 Java class。如果你想 运行 a java class,你仍然需要用老方法 - java <your-class-name>

来自docs

The Java Shell tool (JShell) is an interactive tool for learning the Java programming language and prototyping Java code. JShell is a Read-Evaluate-Print Loop (REPL), which evaluates declarations, statements, and expressions as they are entered and immediately shows the results.

根据此引用,JShell 用于 运行 宁或尝试单个 Java 语句。在传统的 java 方式中,您必须先编写完整的 Java 程序,然后才能 运行 它并查看结果。但是 JShell 允许您尝试 Java 语句而无需构建完整的独立 java 应用程序。

所以对您的问题的简短回答是,不,您不能像 jshell my-jshell-skript.java 这样调用独立的 java 应用程序。但是,您可以调用包含单独的 JShell 命令或 Java 语句的脚本文件。因此,如果您从 Java 程序中复制所有语句并将它们粘贴到 JShell 脚本中,您可以 运行 脚本如下:

% jshell my-jshell-skript.jsh

但这与 运行 独立 java 应用程序不太一样。

concise反馈模式下启动jshell并过滤所需内容-

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

输出: 42

此处有更多详细信息-

在 jshell 中,您可以通过发出以下命令将当前片段保存到文件中:

/save Filename

同样,您可以通过发出以下命令将文件加载到当前 context/session:

/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);
 ==> "[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" }

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>  ==> 8
|  created scratch variable  : int

jshell>

注意:文件最后一行后应包含一个空行 (/n),否则最后一行不会被执行

管道的使用可以通过“连字符”选项实现,在最初的 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