Consider code like:
public class ConsoleTest {
public static void main(String... args) {
System.console().printf("Hello!");
}
}
When run as:
$ java ConsoleTest.java >/dev/null
it prints `Hello!` to stderr, instead of to stdout (where it would be
redirected).
The proposed fix is to simply force the use of stdout. Sadly, this cannot be
done solely using JLine configuration, we actually need to change the JLine's
code for that.
The most tricky part is a test. There are two sub-tests, one effectively
testing a case where all of stdin/out/err are redirected, the other is
attempting to test the case where stdin is attached to a terminal, while stdout
is redirected. The second sub-test using a native functions to create a pty and
to attach to it, and should run in a separate VM, as it leaves the VM attached
to the terminal.
-------------
Commit messages:
- Fixing test.
- Attempting to stabilize the test.
- Improving test to really test the redirect while stdin is connected to a
terminal.
- Fixing typo.
- 8330998: System.console() writes to stderr when stdout is redirected
Changes: https://git.openjdk.org/jdk/pull/18996/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=18996&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8330998
Stats: 212 lines in 3 files changed: 209 ins; 0 del; 3 mod
Patch: https://git.openjdk.org/jdk/pull/18996.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/18996/head:pull/18996
PR: https://git.openjdk.org/jdk/pull/18996