Предположим, у меня есть бинарный файл foo
.
Если я хочу перенаправить вывод какого- foo
либо другого процесса bar
, я мог бы написать ./foo | bar
.
С другой стороны, если бы я хотел time
обув, и перенаправить вывод time
я мог бы написать, time (./foo) | bar
.
Мой вопрос, как я могу прикрепить вывод time
до конца вывода foo
и направить его через ту же трубу ?
Следующее решение - не то, что я ищу, потому что оно запускает два отдельных экземпляра процесса bar
, а я хочу один общий канал для одного экземпляра bar
.
time (./foo | bar) | bar
Любой, кому любопытно, не хочет запускать два экземпляра, bar
потому что bar
может быть сетевым клиентом, и я хочу, чтобы информация о синхронизации была отправлена на сервер как часть того же http POST
сообщения, что и выходные данные процесса.
shell
command-line
pipe
time-utility
merlin2011
источник
источник
Ответы:
Если я пойму, о чем ты просишь, я это сделаю. Я использую команды
ls ~
и вtee
качестве замены для./foo
иbar
, но общая форма того, что вы хотите, это:ПРИМЕЧАНИЕ . Выходные данные
time
уже подключены в конце любого выходного файла./foo
, просто это делается на STDERR. Чтобы перенаправить его через канал, вам нужно объединить STDERR с STDOUT. Вы можете использовать либо|&
или2>&1
сделать это.пример
А вот содержимое файла,
cmd.log
созданногоtee
.источник
time
по умолчанию отправляет свой вывод в stderr вместо stdout. Вам просто нужно перенаправить туда, куда вы хотите.Вы говорите: «С другой стороны, если бы я захотел
time
foo и перенаправил вывод,time
я мог бы написатьtime (./foo) | bar
». но это на самом деле неверно. В этом случае вывод времени будет по-прежнему отображаться на вашей консоли, перенаправляется только стандартный вывод.Вы можете перенаправить stderr специально с:
или все трубы с:
Скобки необходимы для того, чтобы это работало правильно.
источник
Я обнаружил, что это работает на Solaris.
(time ls) &> file
источник