Как напечатать сообщение об ошибке со стандартной ошибкой?

В UNIX я должен написать файл Java, который будет печатать "Выход 1" в стандартную ошибку, а затем выйти со статусом 1.

Вот мой подход.

System.err.println("EXIT 1");
System.exit(1);

Это то, что я должен делать?

Если да, как я должен использовать его в оболочках Unix? Когда я компилирую и запускаю его в bash, он просто печатает "EXIT 1" (поэтому он делает то же самое, что и System.out.println, почему я должен использовать "err"?). Что такое "стандартная ошибка" здесь?

Ответ 1

Каждая программа имела три потока:

  • Стандартный вход (stdin), который обычно поступает с клавиатуры. Открыто как System.in
  • Стандартный выход (стандартный), который обычно идет на консоль. Выставляется как System.out
  • Стандартная ошибка (stderr), которая обычно также поступает на консоль. Выставляется как System.err

Ваша программа верна. Он печатает на stderr, но при нормальных обстоятельствах поток stderr переходит на консоль, как поток stdout.

Однако причиной, по которой вы должны использовать stderr вместо stdout для сообщений об ошибках, является то, что вы можете перенаправить его. Это означает, что вы отправляете содержимое stderr в файл вместо консоли. Например, вы можете сделать это в bash, cmd, Powershell и т. Д.:

$ java Program 2> errors.txt

Теперь все вызовы System.err.println() перейдут на errors.txt вместо экрана, что может помочь при отладке.

Ответ 2

Три потока данных связаны почти с каждым процессом:

  • Стандартный вход: это поток ввода в программу, либо с терминала, и с консоли, либо с выхода из другого процесса, либо с помощью других средств.
  • Стандартная ошибка: здесь должны появляться сообщения об отладке и ошибках. Это делается для того, чтобы эту информацию можно было легко отделить от обычного выхода программы. Веб-серверы делают это, отправляя сообщения об ошибках в файл error_log через stderr, в то время как обычный файл журнала будет, например, access_log.
  • Стандартный вывод: это типичный ожидаемый результат, который должен ожидать пользователь, запускающий программу, чтобы увидеть, что указанный вывод появился.

Стандартный вывод (stdout) и стандартная ошибка (stderr) - это почти всегда первый и второй выходные потоки, поступающие от процесса, соответственно. Это позволяет мне делать что-то вроде /path/to/my/neat/program > logs/program.log 2> logs/program.err а результаты и ошибки сортируются правильно.