Якщо я правильно розумію, ви шукаєте еквівалент tee file1 file2 file3, але замість того, щоб записувати однакові дані в три файли file1, file2і file3, ви хочете передати ті самі дані в три команди cmd1, cmd2і cmd3, тобто
… | ??? cmd1 cmd2 cmd3
має бути рівнозначним
… | cmd1 &
… | cmd2 &
… | cmd3 &
за винятком того, …що буде виконано лише один раз.
Є два способи зробити це.
Ksh93, bash та zsh підтримують процес заміни . Це узагальнення труб, що дозволяє аргументу команди бути файлом, який, коли записується, передає дані як вхід до команди (є також варіант введення, який при зчитуванні отримує дані, виведені командою) . Це є,
echo hello | tee >(cmd1)
друкує helloна стандартний вихід і додатково працює cmd1з helloвведенням.
Наприклад, якщо ви хочете дублювати вхід somecommandі передавати його обом cmd1і cmd2, ви можете використовувати
somecommand | tee >(cmd1) | cmd2
Якщо ваша оболонка не підтримує процес заміни, замість цього можна використовувати названі труби. Дивіться відповідь Арсежа, як це працює. Названі труби менш зручні, ніж підміна процесу, тому що ви повинні створити їх і видалити, а також запустити та синхронізувати процеси вручну. Вони мають перевагу в тому, що вони повністю портативні, тоді як не всі оболонки підтримують процес заміни. Вони також можуть бути використані в сценаріях, відмінних від тих, для яких відбувається підміна процесу.
У деяких системах для заміни технологій використовується внутрішньо названі труби. Однак у більшості систем він покладається на названі файли, що представляють дескриптори файлів .