回答更新后的问题
所有问题都可以通过代码段来解决(也可以使用足够复杂的shell脚本)。但是JShell最好用于调试和学习java - 一个成熟的程序对于所有其他用例来说要灵活得多。
JShell、.jsh 和 java MyClass.java
JShell 是一个用于尝试 Java 代码的交互式 shell。从本质上讲,它是Java的REPL。
由于 JShell 就是关于您键入代码片段,然后对其进行评估,并且将这些代码片段放在文件中而不是多次写入它们通常是有意义的,因此 JShell 支持脚本,这些脚本包含要由 JShell 解释的代码段集合。从这个意义上说,这类似于 bash 接受文件或 command.com 接受文件 - 逐行键入它们等效于导入它们。.jsh
.sh
.bat
单源java文件执行是一个非常不同的野兽。从JDK 11开始,它是糖取代的,
java MyClass.java arg1 arg2 arg3
通过您的本地脚本编写相当于编写
TMPDIR=$(mktemp -d)
javac -d $TMPDIR MyClass.java
java -cp $TMPDIR MyClass arg1 arg2 arg3
rm -rf $TMPDIR
这允许使用单个命令从命令行快速执行单源文件,而无需将其编译的类留在任何地方(不需要创建实际的临时目录,因为可以将这些类存储在内存中)。由于他们已经有3种其他执行模式(用于类,jar文件和模块),因此将其添加为第四种模式并不夸张。java
java
由于OP想要一张图片:
Java作为脚本语言
现在区别已经很清楚了(.jsh用于JShell,单源java可执行文件仅适用于,你猜对了,单源java可执行文件),那么使用Java作为脚本语言呢?
您始终可以选择编写启动器;例如
#!/bin/bash
java -jar MyApp.jar
已经工作了很长时间。从技术上讲,直接命名一个类是可能的,但不是太有用,因为在分发二进制文件时,jar文件更方便 - 首先,它们避免将包结构镜像为一堆文件夹。然而,将启动器脚本与实际的java代码分开仍然有些不友好:您现在需要将两者放在一起,或者至少让启动器能够找到要启动的实际.jar。
现在,他们还引入了以下快捷方式:无论文件名或扩展名如何,您都可以使用“shebang前缀”分发java源代码,如下所示:
#!/path/to/java --source 11
<source of MyClass.java>
将其标记为可执行文件,并从命令行启动它,就像您可以启动任何其他可执行文件一样。例如,将其复制并粘贴到文件中(并在尝试运行之前修复jdk位置):helloworld
#!/opt/jdk-11.0.1/bin/java --source 11
public class Test {
public static void main(String ... args) {
System.out.println("Hello " + (args.length == 0 ? "world!" : args[0]));
}
}
将其标记为可执行文件后,您可以直接使用
$ ./helloworld
Hello world!
它甚至认为它的论点是正确的:
$ ./helloworld Bob!
Hello bob!
对于小程序,如果你不需要走出JDK来拉入其他库,现在分发java代码以供命令行使用将变得容易得多。
Java仍然不会是一种“脚本语言”(它永远不会与python竞争),但是
- 它有一个非常好的REPL循环
- 你可以更容易地执行短程序