如何运行JShell文件?

时间:2017-09-26 12:25:09

标签: java java-9 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>

7 个答案:

答案 0 :(得分:5)

您可以使用这些语句创建名为some.jsh的{​​{3}}文件,并在命令提示符下运行jshell,执行方式为: -

jshell /path/to/some.jsh

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

Jshell script

答案 1 :(得分: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"。

答案 2 :(得分:1)

JShell并不意味着直接运行Java类。如果要运行java类,仍需要以旧方式执行 - java <your-class-name>

来自docs

  

Java Shell工具(JShell)是一个用于学习的工具   Java编程语言和原型Java代码。 JShell是一个   Read-Evaluate-Print Loop(REPL),用于评估声明,   输入并立即显示的语句和表达式   结果。

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

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

% jshell my-jshell-skript.jsh

但这与运行独立的Java应用程序并不完全相同。

答案 3 :(得分: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" }

答案 4 :(得分:0)

@app.route('/<string:msg>')反馈模式下启动jshell并过滤所需内容 -

concise

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

此处有更多详情 - How to execute java jshell command as inline from shell or windows commandLine

答案 5 :(得分: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),否则最后一行将无法执行

答案 6 :(得分:0)

最初的jshell发行版中不提供“ hyphen”选项,可以实现管道使用。

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