Предположим, у меня есть программа 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?