Как захватить stderr и stdout и информацию о времени с помощью tee, включая SIGINT? - PullRequest
0 голосов
/ 30 мая 2018

Предположим, у меня есть программа foo, которая печатает как в stderr, так и в stdout.Я хочу иметь возможность рассчитать время и tee вывод в файл журнала.

Описание программы

Я могу позвонить foo следующим образом:

user$ time ./foo

Это дает (например) вывод на двух потоках:

stdout:

stdout says hi

stderr:

stderr says hi

Объединение stderr и stdout

Я могу комбинировать их достаточно легко, чтобыстандартный вывод с использованием перенаправления BASH I / O:

user$ ./foo 2>&1

Это дает следующий вывод:

стандартный вывод:

stdout says hi
stderr says hi

stderr: (пусто!)

Использование tee

Я могу захватить комбинированный вывод программы, используя tee:

user$ ./foo 2>&1 | tee log.txt

stdout:

stdout says hi
stderr says hi

stderr: (пусто!)

log.txt:

stdout says hi
stderr says hi

Захват времени с помощью time

Я могу рассчитать время выполнения моей программы с помощью встроенной команды BASH time, команда , в то время как объединяет stdout и stderr:

user$ time ./foo 2>&1

стандартный вывод:

stdout says hi
stderr says hi

stderr: :

real    0m0.017s
user    0m0.003s
sys     0m0.004s

Я могу захватитьвывод команды time как описано здесь и перенаправить ее в файл:

user$ ( time ./foo ) > log.txt

стандартный вывод: (пусто!)

stderr:

stderr says hi

real    0m0.017s
user    0m0.003s
sys     0m0.004s

log.txt: stdout говорит привет

Объединение ввода / вывода, захват time вывода,И трубопровод к tee

Как это можно сделать?Я представляю что-то вроде следующего:

( time ./foo 2&>1 ) | tee log.txt

stdout: (пусто!)

stdout says hi
stderr says hi

real    0m0.017s
user    0m0.003s
sys     0m0.004s

stderr: (пусто!)

log.txt:

stdout says hi
stderr says hi

real    0m0.017s
user    0m0.003s
sys     0m0.004s

Выполнение следующих работ, кроме случаев, когда я Ctrl-C (SIGINT) выходит из программы преждевременно.

( time ./foo ) 2&>1 | tee log.txt

Как мне заставить его работать, когда я также нажимаю Ctrl-C?

1 Ответ

0 голосов
/ 30 мая 2018
myfunc() { echo stdout; echo stderr >&2; sleep 3; }
{ time myfunc; } > >(tee log.txt) 2>&1

... испускает содержимое , включая метаданные time в log.txt, даже если отменено с помощью Ctrl + C .

См. Запись вывода tcpdump в сжатый / gziped файл для более глубокого обсуждения этой же проблемы, включая ответ, предназначенный для сценариев, а не для интерактивных интерпретаторов.


Для программы foo в вашем примере вы можете сделать следующее:

{ time ./foo; } > >(tee log.txt) 2>&1
...