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

Reply via email to