Apache 2.4 показывает Symfony 1.4 index.php в виде простого текста

System.console () vs isatty ()

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.

Использование JNI для вызова isatty ()

Технически является возможным сделать это в 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 .

0
задан Vidal 19 March 2019 в 11:32
поделиться

1 ответ

Для всех, кто сталкивался с той же проблемой, что и я, оказалось, что Symfony 1.4 не поддерживает PHP 7.3, поэтому я опустил версию до 5.6.40, и она сработала

0
ответ дан MisMagJr 19 March 2019 в 11:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: