
Итак, у меня есть программа, назовем ее 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