Якщо я правильно розумію, ви шукаєте еквівалент 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
Якщо ваша оболонка не підтримує процес заміни, замість цього можна використовувати названі труби. Дивіться відповідь Арсежа, як це працює. Названі труби менш зручні, ніж підміна процесу, тому що ви повинні створити їх і видалити, а також запустити та синхронізувати процеси вручну. Вони мають перевагу в тому, що вони повністю портативні, тоді як не всі оболонки підтримують процес заміни. Вони також можуть бути використані в сценаріях, відмінних від тих, для яких відбувається підміна процесу.
У деяких системах для заміни технологій використовується внутрішньо названі труби. Однак у більшості систем він покладається на названі файли, що представляють дескриптори файлів .