Intereting Posts
Последняя перезагрузка показала несколько строк одновременно? Разница между deb и deb-src в sources.list Как настроить, какие сетевые подключения активны при загрузке? Exim получение вложений или пересылка электронной почты в очереди почему «timer_t» определяется в «time.h» в Linux, но не OS X Настройка пакета, который был загружен с помощью apt-get Bash – Последовательность чисел в одной строке Как выполнить цикл через несколько подкаталогов для поиска файлов с помощью bash Как взаимодействовать с конкретной файловой системой? Можно ли изменить файл в директории только для чтения? Есть ли способ найти файл драйвера, который использует часть оборудования? Как печатать первые три строки и последние две строки файла, используя perl? Firewalld: как белый список только двух IP-адресов, а не в одной подсети Показывать только имена файлов без путей в окнах XFCE Разница между выходом dmesg и содержимым / var / log / dmesg?

Как я могу перенаправить вывод «time» и вывод команды на тот же самый канал?

Предположим, у меня есть двоичный код, называемый foo .

Если я хочу перенаправить вывод foo на другую bar процессов, я мог бы написать ./foo | bar ./foo | bar .

С другой стороны, если бы я хотел time foo и перенаправить вывод time я мог бы написать, time (./foo) | bar time (./foo) | bar .

Мой вопрос в том, как я могу вставить вывод time в конец выходного foo и пропустить его через один и тот же канал ?

Следующее решение не то, что я ищу, потому что он запускает два отдельных экземпляра bar процессов, в то время как я хочу один общий канал, в один экземпляр bar .

 time (./foo | bar) | bar 

Для любого, кто любопытен, причина, по которой вы не хотите запускать два экземпляра bar состоит в том, что bar может быть сетевым клиентом, и я хочу, чтобы информация о времени была отправлена ​​на сервер как часть того же сообщения http POST что и выход процесса.

    Если я понимаю, о чем вы просите, я это сделаю. Я использую команды ls ~ и tee как stand-ins для ./foo и bar , но общая форма того, что вы хотите, такова:

     $ ( time ./foo ) |& bar 

    ПРИМЕЧАНИЕ . Выход time уже прикреплен в конце любого выхода из ./foo , это делается только на STDERR. Чтобы перенаправить его через трубу, вам нужно объединить STDERR с STDOUT. Вы можете использовать либо |& или 2>&1 чтобы сделать это.

     $ ( time ./foo ) |& bar -or- $ ( time ./foo ) 2>&1 | bar 

    пример

     $ ( time ls . ) |& tee cmd.log cmd.log file1 file2 file3 file4 file5 real 0m0.005s user 0m0.000s sys 0m0.001s 

    И вот содержимое файла cmd.log созданного tee .

     $ more cmd.log cmd.log file1 file2 file3 file4 file5 real 0m0.005s user 0m0.000s sys 0m0.001s 

    time отправляет свой вывод в stderr вместо stdout по умолчанию. Вам просто нужно перенаправить туда, где вы хотите.

    Вы говорите: «С другой стороны, если бы я хотел time foo и перенаправить вывод time я мог бы написать, time (./foo) | bar но это на самом деле неверно. В этом случае вывод времени будет отображаться на консоли, только stdout будет перенаправлен.

    Вы можете перенаправить stderr специально с помощью:

     (time foo) 2>&1 | bar 

    или все трубы с:

     (time foo) |& bar 

    Для этого необходимы скобки.

    Я обнаружил, что это работает на Solaris. (time ls) &> file