13

我想用 JShell 运行整个文件,例如:

$ jshell my-jshell-skript.java

my-jshell-skript.java例如 my的内容在哪里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>
4

7 回答 7

5

您可以创建一个以这些语句命名的Jshell 脚本文件some.jsh,并在您运行的命令提示符下jshell,将其执行为:-

jshell /path/to/some.jsh

在 MacOSX 上,我会执行以下操作:

在此处输入图像描述

于 2017-09-26T13:09:37.120 回答
2

您可以将字符串通过管道传输到 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”行。

于 2017-09-26T12:29:22.440 回答
1

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 应用程序并不完全相同。

于 2017-09-26T14:27:08.247 回答
1

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

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

输出: 42

此处有更多详细信息-如何从 shell 或 windows commandLine 将 java jshell 命令作为内联执行

于 2017-10-14T06:48:25.510 回答
1

在 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" }
于 2018-07-06T12:54:23.940 回答
0

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),否则最后一行不会被执行

于 2020-01-20T11:53:03.010 回答
0

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

于 2020-11-30T02:06:23.073 回答