Shell y Scripts de Java馃敆

jshell es la herramienta disponible en el JDK, desde la versi贸n 9 de Java, que permite la evaluaci贸n de c贸digo de Java de manera interactiva, como si de un shell o interprete de comandos se tratara.

Una sesi贸n en jshell ser铆a, a manera de ejemplo:

[nihilipster@localhost:~]$ jshell
|  Welcome to JShell -- Version 11.0.8
|  For an introduction type: /help intro

jshell> var xs = List.of(10, 20, 30, 40, 50)
xs ==> [10, 20, 30, 40, 50]

jshell> /vars xs
|    List<Integer> xs = [10, 20, 30, 40, 50]

jshell> var ys = xs.stream().map(x -> 2 * x).collect(Collectors.toList())
ys ==> [20, 40, 60, 80, 100]

jshell> /vars ys
|    List<Integer> ys = [20, 40, 60, 80, 100]

jshell> xs.get(0)
$3 ==> 10

jshell> ys.get(0)
$4 ==> 20

jshell> $3 + $4
$5 ==> 30

jshell> $5
$5 ==> 30

jshell> /vars
|    List<Integer> xs = [10, 20, 30, 40, 50]
|    List<Integer> ys = [20, 40, 60, 80, 100]
|    Integer $3 = 10
|    Integer $4 = 20
|    int $5 = 30

jshell> /exit
|  Goodbye

En ella se puede observar lo siguiente:

  • Las expresiones y sentencias son aquellas ofrecidas por la instalaci贸n de Java a la cual pertenezca jshell. En este caso es a la versi贸n 11 de Java.
  • Los comandos propios de jshell empiezan con /. Puede uno obtener una lista de los mismos mediante el comando /help.
  • El prompt de jshell es jshell> por default, aunque dispone de otros o bien la opci贸n de configurarlo mediante el archivo $HOME/.java/.userPrefs/tool/JShell/prefs.xml.
  • Los resultados de la ejecuci贸n de expresiones y sentencias previas quedan almacenando en variables, conocidas como scratch variables, con nombres conformados por el car谩cter $ seguido de un n煤mero entero, as铆 $3 almacena el valor 10, $4 el valor 20 y $5 el valor 30.
  • El comando /vars permite obtener informaci贸n de una variable o bien de las variables disponibles en esta sesi贸n.

Hasta aqu铆 el comportamiento de jshell es similar a la de un interprete de comandos, sin embargo uno puede estar m谩s familiarizado con la idea de un REPL, esto es: tener abierto un archivo en un editor de texto desde el cual escribir c贸digo y enviar (todo el archivo o extractos del mismo) al REPL, el cual se encarga de su evaluaci贸n e impresi贸n de resultados.

A manera de ejemplo, con el editor de texto VIM y el plugin reply.vim:

vim-reply-jshell.jpg

Puede observarse del lado izquierdo un archivo con c贸digo de Java, sin respetar la estructura del lenguaje, y del lado derecho la ejecuci贸n de jshell. Otras opciones para VIM podr铆an ser: neoterm, vim-repl, vim-ripple y zepl.vim

Ahora bien, es posible almacenar tanto c贸digo de java como comandos propios de jshell en un archivo:

  • Suponiendo que se tiene el archivo script.jsh con el siguiente contenido:

    //usr/bin/env jshell --no-startup --feedback silent "$0" "$@"; exit $?
    
    import java.util.*;
    import java.util.stream.*;
    
    var xs = List.of(10, 20, 30, 40, 50);
    var ys = xs.stream().map(x -> 2 * x).collect(Collectors.toList());
    
    for (Integer x : ys) {
      System.out.println(x);
    }
    
    /exit
    
  • Se le dan permisos de ejecuci贸n para poder ejecutarlo desde la l铆nea de comandos:

    [nihilipster@localhost:~]$ chmod +x script.jsh
    [nihilipster@localhost:~]$ ./script.jsh
    20
    40
    60
    80
    100
    

El proyecto jbang lleva esto 煤ltimo al punto de poder crear una aplicaci贸n para la l铆nea de comandos.

Enlaces馃敆