Чи можна перенаправити висновок команди на кілька команд?


21

Наскільки я знаю, я можу використовувати команду tee, щоб розділити стандартний вихід на екран та інші файли:

command -option1 -option2 argument | tee file1 file2 file3 

Чи можна перенаправити вихід на команди замість файлів за допомогою трійника, щоб я теоретично міг створити ланцюжок команд?


3
Поясніть, що ви маєте на увазі під «вихідним сигналом» та опишіть, що ви маєте на увазі, створюючи «мережу команд».
Яніс

у linux кожна команда має один вхід і два виходи. вони позначені 0 (для введення), 1 (для виводу) та 2 (для виведення помилок). Я думав про 1, коли я сказав "вихідний сигнал", тому що я прочитав, що команда tee розділяє лише вихідний з міткою 1. Коли я сказав "мережа команд", я був не дуже технічним, я не впевнений, як мережа правильно визначена з математична точка зору, але я просто думав про дерево команд, типологічно кажучи, так що деякі команди можуть бути батьками для більш ніж однієї дочірньої команди.
Абдул Аль Хазред

Дякуємо за ваше роз’яснення. Будь ласка, не використовуйте слово signal, оскільки воно має певне значення в Unix, і термін був дуже оманливим у цьому контексті. Знову дякую.
Яніс

У командному рядку введіть man -k сигнал, щоб дізнатись особливе значення цього ключового поняття в UNIX та Linux. людина вбивство було б гарною сторінкою для початку.
Роб

Крім того, багато людей називають stdin stdout і stderr як вхідні або вихідні "потоки". Звідси витікають невеликі річки даних. Ви правильно схопилися за слово, щоб описати їх спільно, але сигнал - це просто неправильне слово.
Роб

Відповіді:


25

Ви можете використовувати названі труби ( http://linux.die.net/man/1/mkfifo ) у командному рядку teeта мати команди зчитування на названих трубах.

mkfifo /tmp/data0 /tmp/data1 /tmp/data2
cmd0 < /tmp/data0 & cmd1 < /tmp/data1 & cmd2 < /tmp/data2 &
command -option1 -option2 argument | tee /tmp/data0 /tmp/data1 /tmp/data2

По commandзавершенні роботи teeзакриються названі труби, які подаватимуть сигнал EOF (зчитування 0 байтів), на кожному з /tmp/dataNяких нормально завершуються cmdNпроцеси. Реальний приклад:

$ mkfifo /tmp/data0 /tmp/data1 /tmp/data2
$ wc -l < /tmp/data0 & wc -w < /tmp/data1 & wc -c < /tmp/data2 &
$ tee /tmp/data0 /tmp/data1 /tmp/data2 < /etc/passwd >/dev/null
$ 61
1974
37

Через фонові процеси оболонка повертає підказку перед виходом програми. Усі три екземпляри wcприпиняються нормально.


1
У баші , ви можете забезпечити багато набору тексту /tmp/data/{0,1,2}. Потім знову в баші ви можете використовувати процедуру заміни і mkfifoповністю пропустити
Тобіас Кіенцлер,

2
Можливо, хочете змінити / dev / data0 на / tmp / data0. Також дякую за те, що відповіли на це питання в оболонковому вигляді. Це корисніше, ніж припускати, що всі використовують bash.
абонет

15

Якщо я правильно розумію, ви шукаєте еквівалент 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

Якщо ваша оболонка не підтримує процес заміни, замість цього можна використовувати названі труби. Дивіться відповідь Арсежа, як це працює. Названі труби менш зручні, ніж підміна процесу, тому що ви повинні створити їх і видалити, а також запустити та синхронізувати процеси вручну. Вони мають перевагу в тому, що вони повністю портативні, тоді як не всі оболонки підтримують процес заміни. Вони також можуть бути використані в сценаріях, відмінних від тих, для яких відбувається підміна процесу.

У деяких системах для заміни технологій використовується внутрішньо названі труби. Однак у більшості систем він покладається на названі файли, що представляють дескриптори файлів .


5
Дивіться також peeз moreutils.
Стефан Шазелас

Зауважимо, що процес заміщення був введений ksh88.
Стефан Шазелас


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.