Hi Sherman,
JShell uses two processes - the main one interacts with the terminal and
compiles the user's snippets. The other one runs the snippets, and is
not connected to a terminal, so System.console() does not work there.
IIRC the call to System.console() in jshell/jline that is part of this
problem is basically a way to call Console.istty() - the returned
Console is not used. I was considering tweaking jshell to avoid this
issue, and I think it would be possible, but seemed some other programs
might run into issues as well, so seemed better to fix in Console.
Jan
On 25.4.2018 17:52, Xueming Shen wrote:
Hi Jan,
I saw System.console() returns null inside jshell ... but it seems there
are 2 vms.
I would assume jshell itself sets the terminal to raw and then call
System.console()?
for example an alternative for this issue is to ask jshell's impl to
call System.console()
before going into raw mode? No, I'm not saying the proposed one is not a
good one,
just wanted to make sure I understand the situation correctly.
Thanks,
Sherman
On 4/25/18, 4:50 AM, Jan Lahoda wrote:
Hi,
Under:
https://bugs.openjdk.java.net/browse/JDK-8194750
j.i.Console was changed to capture the state of the terminal echo at
creation time, and to restore it on shutdown.
That is problematic at least in jshell, where the terminal is already
in the raw mode when j.i.Console is created, and so "echo disabled" is
recorded there. So even though jshell itself sets the terminal into
the original mode when it terminates, the shutdown hook in
j.i.Console, which is run later, sets the echo to off even if it was
enabled before the VM started.
My understanding is that the shutdown hook is only needed in case the
VM goes down while readPassword is running. So I tried to change the
shutdown hook to only work while readPassword is running.
Bug: https://bugs.openjdk.java.net/browse/JDK-8202105
Webrev: http://cr.openjdk.java.net/~jlahoda/8202105/webrev.00/
What do you think?
Thanks,
Jan