Могут ли программы, подобные unix, определять, куда направляются их выходные данные?

Могут ли программы, подобные unix, определять, куда направляются их выходные данные?

До недавнего времени я был под впечатлением, что программы Unix-y не знают, куда направляется их вывод, будь то стандартный вывод, перенаправление в файл или в конвейер. Однако не имеющий отношения к делу вопрос U&L на этом сайте привлек мое внимание к следующему примеру:

% echo "hello world" > file

% grep --color=auto lo file
hello world

% grep --color=auto lo file | cat
hello world

Очевидно, вы не можете видеть это здесь, но первая команда показывает 'lo' выделенным, как и ожидалось. Однако второй вызов, который проходит через канал, не показывает цвет. Это говорит о том, что он grepзнал, что его вывод направляется в канал, и избегал вывода цвета. Как это делается?

решение1

Можно определить, ссылается ли дескриптор файла на tty.

Проверитьфункцияisatty.

В качестве альтернативы вы можете использоватьфункцияfstatчто дает вам часть информации о файле.

решение2

Да, они есть. Есть несколько методов, чтобы определить, куда идет выход. Длясравнение см. мой ответ на связанный вопрос на stackoverflow.

решение3

Легко. Можно использовать разные способы, чтобы определить, куда идет вывод. Так что в питоне вы можете сделать что-то вроде

    /* CODE. Input will be parsed and executed */
int
PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
                     PyCompilerFlags *flags)
       {
    if (filename == NULL)
        filename = "???";
    if (Py_FdIsInteractive(fp, filename)) {
        int err = PyRun_InteractiveLoopFlags(fp, filename, flags);

Связанный контент