Как записать вывод без буферизации из stdout и stderr - PullRequest
8 голосов
/ 17 февраля 2009

У меня проблема с регистрацией для вывода из автоматической сборки.

Сборка выполняется с помощью Makefile и утилиты makefile.

Проблема в том, что обычный вывод, такой как командные строки компилятора, идет в stdout, а ошибки компиляции - в stderr.

Я хочу получить выходные данные из сборки, которые будут отображаться на экране. Так что-то вроде:

(stdout) CC -c file.cpp
(stderr) Compile error at file.cpp line 232, blah blah blah
(stdout) CC -c file2.cpp

То, что я попробовал (из сценария ksh):

make -k> build.log 2> build.log

В результате получается один файл журнала, но проблема в том, что потоки буферизуются, и поэтому все результаты в файле журнала перемешиваются.

Я мог бы записать вывод в 2 отдельных файла журнала, но тогда у меня не было бы информации о том, как склеить их обратно в один файл журнала.

Есть ли способ отключить буферизацию для stdout и stderr в этом случае?

Ответы [ 4 ]

24 голосов
/ 17 февраля 2009
make -k > build.log 2>&1

Это должно работать лучше для вас, потому что это не перенаправление stderr и stdout отдельно, а перенаправление stderr в stdout, что должно синхронизировать буферизацию.

Если вы хотите записать его в файл, а также распечатать на консоли:

make -k 2>&1 | tee build.log
5 голосов
/ 17 февраля 2009

Попробуйте это

make -k > build.log 2>&1
0 голосов
/ 06 мая 2009

setbuf (стандартный вывод, NULL); -> отключает буферизацию стандартного вывода

0 голосов
/ 21 апреля 2009

Я мог бы захватить вывод в 2 отдельные файлы журнала, но тогда я бы не знаю, как их приклеить обратно вместе в одном файле журнала.

Склеить их обратно сложно, но на это тоже есть правильный ответ, и это работает! См. Как сохранить или перенаправить стандартный вывод и стандартный вывод в разные файлы?

...