RFR: 8330998: System.console() writes to stderr when stdout is redirected

Jan Lahoda jlahoda at openjdk.org
Mon Apr 29 11:49:30 UTC 2024


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


More information about the core-libs-dev mailing list