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

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

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

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

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

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

  • Кошка никогда не читает с терминала?
  • Должен ли я использовать одиночные или двойные угловые скобки для перенаправления на / dev / null?
  • Команда «cp p2 & 2 &» заставляет Konsole исчезать, это ошибка?
  • Выходные данные команды scp / sftp как для стандартного вывода, так и для файла на сервере linux
  • Обертка скрипта оболочки с тройником
  • Как отправить stdout на несколько команд в оболочке рыбы?
  • wget возвращает html-страницу вместо исходного файла
  • GoAccess не перенаправляет свой вывод как скрипт CGI
  • 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 - лучшая ОС в мире.