Чи може вихід однієї команди передатись двом іншим командам?


Відповіді:


56

Здається, що teeкоманда зробить те, що ви хочете.

Ключовим є використання

>( )

для процесу заміщення . З tee, використовуйте наступний шаблон:

tee >(proc1) >(proc2) >(proc3) | proc4

Тож якщо ви хочете використовувати вихід у lsякості вхідних даних для двох різних grepпрограм, збережіть вихід кожного grepз різних файлів і перекажіть усі результати less, спробуйте:

ls -A | tee >(grep ^[.] > hidden-files) >(grep -v ^[.] > normal-files) | less

Результати ls -Aзаповіту будуть "прокладені" в обидва greps. Файл hidden-filesматиме вміст з виводу першого grep, а normal-filesтакож матиме результати другого grep. Усі файли будуть показані в пейджері less. EDIT : що ви бачите lessце точно такий же вихід з ls -A, а не результат grepс. Якщо ви хочете змінити вихід з ls -Aна less(наприклад, поміняти порядок, щоб звичайні файли були перелічені перед прихованими), то спробуйте це:

ls -A | tee >(grep ^[.]) >(grep -v ^[.]) >/dev/null | less

Без >/dev/nullцього вихід greps буде доданий до виходу ls -Aзамість того, щоб замінити його.

джерело


3
це дуже добре!
hayalci

3
+1, тому що навіть після 10 років сценаріїв снарядів я цього ніколи не бачив!
jtimberman

6

Використовуйте «трійник».

Приклад:

grep someSearchString someFile | tee /dev/tty | wc -l > grepresult

Це надішле висновок команди grep як на термінал, так і на wc (вихід якого в свою чергу переспрямований на файл grepresult).

"Трійник" пояснюється у статті Вікіпедії tee (команда) . Центральним є: "Команда tee читає стандартний вхід, потім записує його вміст на стандартний вихід і одночасно копіює його у вказаний файл (и) або змінні."

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