[Java Shell 指南] JShell 命令介绍

yufei       5 年, 7 月 前       1517

前面的章节中我们有简要的提到了几个 JShell 中的命令,比如 /help 显示帮助信息, /list 列出所有输入的代码片段等。

JShell 提供了丰富的命令,用于控制环境上下文和在会话中显示信息。

JShell 中的命令和代码片段是不一样的,命令都是以前导的反斜杠 ( / ) 开头,比如要显示所有已经定义的变量,可以使用 /var ,要显示所有已经定义的方法,可以使用 /methods ,要显示所有已经定义的类型,可以使用 /types ,要显示所有输入的代码片段,可以使用 /list

我们分别在 JShel 中演示下刚刚提到的那些命令。( 演示的结果基于前一章节 Java Shell 指南: 代码片段 ( 一 )

jshell> /vars
|    int $2 = 4
|    String $4 = "简单教程简单教程"
|    String $6 = "Twice:简单教程"
|    String x = "简单教程"
|    BigDecimal PI = 3.141592653589793238462643383
|    double $14 = 0.0
|    int $16 = 0
|    JFrame jframe = javax.swing.JFrame[frame0,0,23,0x0,invalid,hidden,layout=java.awt.BorderLayout,title=demo,resizable,normal,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]
|    Graphics gc = null

jshell> /methods
|    String twice(String)
|    double volume(double)
|       它无法调用, 直至 此错误已更正: 
|          二元运算符 '*' 的操作数类型错误
|            第一个类型:  double
|            第二个类型: java.math.BigDecimal
|          return 4.0 / 3.0 * PI * cube(radius);
|                 ^------------^
|    double cube(double)
|    int divide(int,int)

jshell> /list

   2 : 2 + 2
   4 : twice("简单教程")
   5 : String twice(String s) {
          return "Twice:" + s;
       }
   6 : twice("简单教程")
   8 : String x = "简单教程";
   9 : double volume(double radius) {
       return 4.0 / 3.0 * PI * cube(radius);
       }
  10 : double cube(double x) { return x * x * x; }
  13 :  BigDecimal PI = new BigDecimal("3.141592653589793238462643383");
  14 : volume(5)
  15 : int divide(int x, int y) {
       return x / y;
       }
  16 : divide(5, 0)
  17 : import javax.swing.JFrame;
  18 : JFrame jframe = new JFrame("demo");
  19 : import java.awt.Graphics;
  20 : Graphics gc = jframe.getGraphics();

jshell> /types

jshell> 

请注意,这些命令只会显示变量的类型和值,以及方法的签名。

JShell 还有一个默认的启动脚本,它会在 JShell 启动之前以静默方式自动执行,这个脚本会导入一些经常用到的类和包,使得我们可以快速的进行代码试验。

但是这个默认启动的脚本导入的代码,并不会通过 /lists 列出来,除非使用 /list -all/list -start 命令

前者会显示所有的代码片段,包括默认脚本导入的类和包,后者只会显示启动时默认脚本导入的包。

jshell> /list -all

  s1 : import java.io.*;
  s2 : import java.math.*;
  s3 : import java.net.*;
  s4 : import java.nio.file.*;
  s5 : import java.util.*;
  s6 : import java.util.concurrent.*;
  s7 : import java.util.function.*;
  s8 : import java.util.prefs.*;
  s9 : import java.util.regex.*;
 s10 : import java.util.stream.*;
   1 : int x = 30;
   2 : 2 + 2
   3 : String twice(String s) {
        return s +s;
       }
   4 : twice("简单教程")
   5 : String twice(String s) {
          return "Twice:" + s;
       }
   6 : twice("简单教程")
   7 : int x = 45;
   8 : String x = "简单教程";
   9 : double volume(double radius) {
       return 4.0 / 3.0 * PI * cube(radius);
       }
  10 : double cube(double x) { return x * x * x; }
  11 :  BigDecimal PI = new BigDecimal("3.141592653589793238462643383");
  12 : double PI = 3.1415926535;
  13 :  BigDecimal PI = new BigDecimal("3.141592653589793238462643383");
  14 : volume(5)
  15 : int divide(int x, int y) {
       return x / y;
       }
  16 : divide(5, 0)
  e1 : list
  e2 : Systemm.c
  17 : import javax.swing.JFrame;
  e3 : new JFrame1
  e4 : jframe  = new JFrame("Demo")
  18 : JFrame jframe = new JFrame("demo");
  19 : import java.awt.Graphics;
  20 : Graphics gc = jframe.getGraphics();

jshell> /list -start

  s1 : import java.io.*;
  s2 : import java.math.*;
  s3 : import java.net.*;
  s4 : import java.nio.file.*;
  s5 : import java.util.*;
  s6 : import java.util.concurrent.*;
  s7 : import java.util.function.*;
  s8 : import java.util.prefs.*;
  s9 : import java.util.regex.*;
 s10 : import java.util.stream.*;

可以看到,默认的启动脚本导入的包和类都是经常会用到的。如果你想要定制默认的启动条目,可以使用 /set start 命令。有关次命令的详细信息,可以输入 /help /set start 查看。

另一方面,也可以使用 /save -start 命令将当前启动脚本保存为你自己的启动脚本的入口脚本。

此外, /exit 你知道的,用于退出 JShell。 /save 用于保存代码片段,/open 用于从外部文件中导入代码片段,还有一些其它的命令,我们就不一一介绍了。

反正有任何疑问,直接输入 /help 基本就能解决了。

JShell 命令的自动完成功能

与片段自动完成类似,当我们输入命令和命令选项时,可以使用 <Tab> 键自动完成命令或选项。如果 JShell 无法根据输入的内容确定如何自动完成,则会提供可能的选择。

例如下面的示例,我们可以输入 / 后直接按下 <Tab> 键,然后就会提示接下来如何输入

jshell> /<Tab>
/!          /?          /drop       /edit       /env        /exit       /help       /history    /imports    /list       
/methods    /open       /reload     /reset      /save       /set        /types      /vars       

<再次按 Tab 可查看提要>

jshell> /

如果前置输入能够导致接下来的输入唯一,那么就会自动完成命令,例如,我们先输入 /l 然后按下 <Tab> 键,这样就会自动完成为 /list 命令

jshell> /l<Tab>
jshell> /list 

除了命令自动完成外,命令的选项也可以自动完成,当我们输入 - 后再按下 <Tab> 就就会给出一些提示

jshell> /list -<Tab>
-all       -history   -start     

<再次按 Tab 可查看提要>

jshell> /list -

注意: 一般情况下,首次按下 <Tab> 键都会提示如果再次按下则会显示命令概要的消息

jshell> /list -<Tab>
-all       -history   -start     

<再次按 Tab 可查看提要>

jshell> /list -<Tab>
列出您键入的源

<再次按 Tab 可查看完整文档>

jshell> /list -<Tab>
显示前面带有其片段 ID 的片段。

/list
    列出您键入的或使用 /open 读取的当前活动的代码片段

/list -start
    列出评估的启动片段

/list -all
    列出所有片段,包括失败的片段、覆盖的片段、删除的片段和启动片段

/list <名称>
    列出具有指定名称的片段(特别是活动片段)

/list <id>

<再次按 Tab 可查看下一页>

jshell> /list -

如果输入的选项是唯一的,那么它也会自动完成,例如当我们输入 /list -a 后按下 <Tab> 键,则会自动补全为 /list -all

jshell> /list -a<Tab>
jshell> /list -all

另外,命令的自动完成也适用于代码片段名称,例如变量名、方法名和类名。例如我们输入 /ed v 命令后,如果按下 <Tab> 键,则会自动补全为 /ed volume

jshell> /ed v<Tab>
jshell> /ed volume

对于 /open 命令,还可以在参数位置提示所有可以打开的文件名

jshell> /open 
<再次按 Tab 可查看所有可能的输入提示; 可能的输入提示总计: 123>

jshell> /open  

当然了,因为我们没有保存任何代码片段,所有可供打来的文件列表就是空的。并且,如果想要输入的文件名是唯一的,则会自动补全那个文件名。我这里就不演示了。

命令缩写

其实 JShell 中的命令已经很短了,而且容易记住,但即便如此,JShell 还是提供了某些命令的缩写功能。

命令缩写可以减少我们的输入,唯一的要求就是缩写的命令必须是唯一的。而且命令/set 子命令,命令参数和命令选项都可以缩写。

例如 /list 的缩写为 /l ,例如 /list -all 的缩写为 /l -a 。例如,我们可以使用 /l -a 来代替 list -all 输出所有的代码片段

jshell> /l -a

  s1 : import java.io.*;
  s2 : import java.math.*;
  s3 : import java.net.*;
  s4 : import java.nio.file.*;
  s5 : import java.util.*;
  s6 : import java.util.concurrent.*;
  s7 : import java.util.function.*;
  s8 : import java.util.prefs.*;
  s9 : import java.util.regex.*;
 s10 : import java.util.stream.*;
   1 : int x = 30;
   2 : 2 + 2
   3 : String twice(String s) {
        return s +s;
       }
   4 : twice("简单教程")
   5 : String twice(String s) {
          return "Twice:" + s;
       }
   6 : twice("简单教程")
   7 : int x = 45;
   8 : String x = "简单教程";
   9 : double volume(double radius) {
       return 4.0 / 3.0 * PI * cube(radius);
       }
  10 : double cube(double x) { return x * x * x; }
  11 :  BigDecimal PI = new BigDecimal("3.141592653589793238462643383");
  12 : double PI = 3.1415926535;
  13 :  BigDecimal PI = new BigDecimal("3.141592653589793238462643383");
  14 : volume(5)
  15 : int divide(int x, int y) {
       return x / y;
       }
  16 : divide(5, 0)
  e1 : list
  e2 : Systemm.c
  17 : import javax.swing.JFrame;
  e3 : new JFrame1
  e4 : jframe  = new JFrame("Demo")
  18 : JFrame jframe = new JFrame("demo");
  19 : import java.awt.Graphics;
  20 : Graphics gc = jframe.getGraphics();

jshell> 

另外,/set 的缩写是 /sefeedback 的缩写是 fe。 并且唯一以 v 开头的反馈模式是 verbose 的,假设不存在以 v 开头的自定义反馈模式,那么我们可以使用下面的命令将反馈模式设置为 verbose

jshell> /se fe v
|  反馈模式: verbose

需要注意的是,/s 并不是一个缩写,因为 /save/set 两个命令都以相同的字母开头。如有疑问,你可以使用 <Tab> 自动补全查看选项

jshell> /s
/save    /set     

<再次按 Tab 可查看提要>

jshell> /s
目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.