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

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

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

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

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

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

  • Почему `> my.log 2> & 1 &` заставляет работу поддерживать выход из системы?
  • Какой процесс / программа создает / записывает файл, к которому перенаправляется ввод-вывод?
  • Отдельный шум STDOUT от ncurses
  • Измените состояние светодиодов клавиатуры, начиная с X сеанса, без доступа root
  • Перенаправление stdin с stdout в файл
  • Bash: использование двухсторонних перенаправлений в сценарии оболочки
  • Непонятно о поведении моего скрипта при записи в файл журнала
  • Декодирование «prog> file 2> & 1"
  • 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

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