System.console (), как уже упоминалось @Bombe, работает для простых случаев проверки связи с консолью. Однако проблема с System.console () заключается в том, что он не позволяет вам определить, является ли это STDIN или STDOUT (или и то и другое, либо подключено к консоли).
Разница между Java System.console () и C isatty () могут быть проиллюстрированы в следующем случае-пробоем (где мы передаем данные в / из гипотетического Foo.class):
1) STDIN и STDOUT являются tty
%> java Foo
System.console() =>
isatty(STDIN_FILENO) => 1
isatty(STDOUT_FILENO) => 1
2) STDOUT is tty
%> echo foo | java Foo
System.console() => null
isatty(STDIN_FILENO) => 0
isatty(STDOUT_FILENO) => 1
3) STDIN - tty
%> java Foo | cat
System.console() => null
isatty(STDIN_FILENO) => 1
isatty(STDOUT_FILENO) => 0
4) Ни STDIN, ни STDOUT не являются tty
%> echo foo | java Foo | cat
System.console() => null
isatty(STDIN_FILENO) => 0
isatty(STDOUT_FILENO) => 0
Я не могу сказать вам, почему Java не поддерживает лучшую проверку tty. Интересно, не поддерживают ли некоторые из целевых ОС Java.
Технически является возможным сделать это в Java (как указывал stephen-c @) с некоторым довольно простым JNI , но это сделает ваше приложение зависимым от C-кода, который не может быть переносимым в другие системы. Я могу понять, что некоторые люди, возможно, не захотят туда идти.
Быстрый пример того, как будет выглядеть JNI (закрашивание большого количества деталей):
Java: tty / TtyUtils.java
public class TtyUtils {
static {
System.loadLibrary("ttyutils");
}
// FileDescriptor 0 for STDIN, 1 for STDOUT
public native static boolean isTty(int fileDescriptor);
}
C: ttyutils.c (предполагает сопоставление ttyutils.h ), скомпилированный в libttyutils.so
#include
#include
JNIEXPORT jboolean JNICALL Java_tty_TtyUtils_isTty
(JNIEnv *env, jclass cls, jint fileDescriptor) {
return isatty(fileDescriptor)? JNI_TRUE: JNI_FALSE;
}
Если у вас есть возможность использовать другой язык, большинство других языков, я могу думать о поддержке tty-checking , Но, поскольку вы задали этот вопрос, вы, наверное, уже это знаете. Первыми, которые приходят мне в голову (кроме C / C ++), являются Ruby , Python , Golang и Perl .
Для всех, кто сталкивался с той же проблемой, что и я, оказалось, что Symfony 1.4 не поддерживает PHP 7.3, поэтому я опустил версию до 5.6.40, и она сработала