Перенаправление вывода программы в файл не удается

Перенаправление вывода программы в файл не удается

Итак, у меня есть программа, назовем ее foo. Я пытаюсь перенаправить ее вывод терминала в файл с помощью следующей команды.

foo > ./someFile.txt

Теперь, когда я запускаю эту команду, создается someFile.txt, однако он пустой. Есть предложения, как перенаправить вывод терминала?

решение1

Ожидаемое поведение — someFile.txtсоздание файла. Будет ли этот файл содержать что-либо, зависит от того, что fooдолжна делать ваша программа.

С какой бы проблемой вы ни столкнулись, она, похоже, не связана с перенаправлением вывода. Вы можете попробовать следующую команду в качестве теста:

cat > someFile.txt

введите что угодно. Что бы вы ни набрали, будет перенаправлено на someFile.txt(заканчивается ctrl+ d).

Кстати, выходной файл создается вашей оболочкой, а не вашей программой foo. Даже если вы введете несуществующую команду, выходной файл все равно будет создан (пустой):

/bin/nonexistent > zzz

решение2

Другая возможность заключается в том, что он fooиспользует функцию isattyи ничего не записывает в stdout, если stdout не указывает на интерактивное устройство.

СИНОПСИС

#include <unistd.h>
int isatty(int fd);

ОПИСАНИЕ Функция isatty() проверяет, является ли fd открытым файловым дескриптором, ссылающимся на терминал.

Эта короткая программа на Python демонстрирует это:

import sys, os

if sys.stdout.isatty():
    print "Hello, tty %s" % os.ttyname(1)
else:
    print "stdout: not a typewriter: how boring"

Как и эта короткая программа на языке C:

#include <stdio.h>
#include <unistd.h>

int main (void) {
    if ( isatty(stdout) ) {
        printf("Hello, tty %s\n", ttyname(1));
    } else {
        printf("stdout: not a typewriter: how boring\n");
    }
    return 0;
}

Обе программы ведут себя одинаково:

$ ./isatty > notatty ; cat notatty
stdout: not a typewriter: how boring

$ ./isatty.py
Hello, tty /dev/pts/1

$ ./isatty | cat
stdout: not a typewriter: how boring

Программы могут выбирать, как, что и вообще печатать ли, в зависимости от того, перенаправляются ли они.

Распространенным применением этого является избежание записи управляющих последовательностей ANSI, считываемых терминалами ( \e[33;1mи т. д.) для раскрашивания текста в файлы, что выглядит некрасиво и сбивает с толку парсеры.

решение3

У меня была та же проблема. Мой программный журнал не был записан в [stdout], как ожидалось, а вместо этого в [stderr]. Поэтому решением было перенаправление как [stdout], так и [stderr]:

foo >> someFile.txt 2>&1

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