using jshell in executable UNIX scripts

Cay Horstmann cay at horstmann.com
Tue Oct 11 20:11:28 UTC 2016


You may know that the Scala REPL and Nashorn let you use a shebang in 
the first line. (Nashorn doesn't do it very well: command line arguments 
must be preceded by -- because jjs can take multiple scripts.)

I have used the feature for Scala quite a few times. But it's a very 
minor convenience. Everytime the script turned into anything of any 
value, I wanted it compiled, and then I had to add the Scala equivalent 
of "public static void main" anyway.

If I want to do the same in Java, the // trick is good enough.

Cheers,

Cay

Le 10/11/2016 à 12:52 PM, Brian Goetz a écrit :
> I understand why you'd like to coopt jshell into this -- after all, it
> is convenient and it seems "so close" -- but this is trying to turn
> jshell into something it wasn't designed for.  But this wasn't an
> oversight; we deliberately chose to leave this *outside* of the jshell
> requirements, because it feels like an entirely different feature.
>
> More generally, "hacks" like this always come back to bite you. What you
> want is a "no main, no compile java runner".  Jshell looks like that,
> but it isn't.  When you have nothing, a little of something seems like a
> really good idea; but the warts will become apparent almost
> immediately.  I'd much rather do nothing for this now, and consider
> doing something better in the future, than doing something bad now --
> which is what this would be.
>
>
> On 10/10/2016 9:55 AM, Peter Levart wrote:
>> Hi,
>>
>> "jshell" command is a very nice interactive Java shell, but it could
>> also be used for scripting. An executable script in any major UNIX OS
>> is a textual file with executable permissions that starts with the
>> following two characters: #!
>> The rest of the 1st line is the path to the interpreter executable and
>> any arguments passed to it. The last argument passed to the
>> interpreter is the path to the executable script. In case of jshell,
>> one would want such script to be written like:
>>
>> #!/home/peter/Apps64/jdk9/bin/jshell
>>
>> System.out.println("Hello World!");
>>
>> /exit
>>
>>
>> The problem is that jshell tries to parse the 1st line using jshell
>> syntax and the result of running above executable script is:
>>
>> | Error:
>> |  illegal character: '#'
>> | #!/home/peter/Apps64/jdk9/bin/jshell
>> |  ^
>> |  Error:
>> |  illegal start of expression
>> |  #!/home/peter/Apps64/jdk9/bin/jshell
>> |    ^
>> Hello World!
>>
>>
>> The script is actually executed, but the syntax error encountered in
>> the 1st line is printed too.
>>
>> Would it be possible for jshell to skip 1st line if it starts with
>> characters #! like other shells do?
>>
>>
>> Regards, Peter
>>
>


-- 

Cay S. Horstmann | http://horstmann.com | mailto:cay at horstmann.com


More information about the kulla-dev mailing list