Есть ли противоположность «тройника», чтобы объединить несколько труб?

У меня есть несколько процессов, которые производят вывод на STDOUT и STDERR , которые я перенаправил на нумерованные файловые дескрипторы, и я хочу собрать весь вывод вместе в один файл.

Я наивно пытался

 [input processes] | cat <3 <4 <5 2>&1 >[output file] 

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

Какие-либо предложения?

  • Различия в перенаправлении между &>> & и 2> & 1
  • скрипт использовать вывод команды (ls) и использовать ее в другой команде
  • Запись и вывода и потока ошибок в один и тот же файл
  • Объединение тысяч файлов:> vs >>
  • bash как перенаправить вывод из функции в / dev / null
  • Возможно ли, чтобы системный администратор прослушивал терминалы своих пользователей?
  • Управление терминалом в середине трубы
  • Создайте временный файл из перенаправления или вывода stdout
  • 2 Solutions collect form web for “Есть ли противоположность «тройника», чтобы объединить несколько труб?”

    Совмещение вывода вместе не является двойным tee . tee делает несколько копий своего ввода, тогда как вывод для сопоставления не предполагает слияния данных.

    Чтобы объединить источники вывода, просто перенаправьте их все в один и тот же дескриптор файла. Перемешивание источников несколько непредсказуемо в общем, но достаточно малые записи в трубу гарантированно являются атомарными . ( Возможность рассказать границы со стороны чтения – это еще одна история .)

     { data_source_1 & data_source_2 & wait; } >merged_output 

    Если вы получаете входные данные из нескольких файловых дескрипторов и хотите их объединить, пройдите через каждый из них.

     { cat <&3 & cat <&4 & wait; } >merged_ouput 

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

     … 3>merged_ouput 4>&3 

    Вам необходимо добавить STDERR и STDOUT в STDOUT в каждом процессе.

    Пример:
    processA 2>&1 | processB | processC

    STDOUT и STDERR будут перенаправлены через PIPE в качестве STDIN для processB. Однако processC будет получать STDOUT для ProcessB как STDIN.

    Поэтому, если вам нужны STDOUT и STDERR процесса B как STDIN для processC, это будет: processA 2>&1 | processB 2>&1 | processC processA 2>&1 | processB 2>&1 | processC

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

    (processA; processB) >./just_STDOUT.txt

    (processA 2>&1; processB 2>&1) >./STDOUT_AND_STDERR.txt

    Linux и Unix - лучшая ОС в мире.