Как я могу направить вывод одной команды одновременно с вводом двух других команд?
2 ответа
Похоже, команда tee
сделает то, что вы хотите.
Ключ должен использовать
>( )
для процесса замены. С tee
используйте следующий шаблон:
tee >(proc1) >(proc2) >(proc3) | proc4
Поэтому, если вы хотите использовать вывод ls
качестве ввода для двух разных программ grep
, сохраните вывод каждого grep
в разные файлы и перенаправить все результаты через less
, попробуйте:
ls -A | tee >(grep ^[.] > hidden-files) >(grep -v ^[.] > normal-files) | less
Результаты ls -A
будут "переданы" в обе команды grep
. Файл hidden-files
будет иметь содержимое из вывода первого grep
, а normal-files
будут иметь результаты второго grep
. Все файлы будут отображаться в пейджере РЕДАКТИРОВАТЬ: то, что вы видите в less
.less
это точно такой же вывод ls -A
, а не результат grep
s. Если вы хотите изменить вывод с ls -A
на less
(например, поменять порядок, чтобы обычные файлы были перечислены перед скрытыми), попробуйте следующее:
ls -A | tee >(grep ^[.]) >(grep -v ^[.]) >/dev/null | less
Без >/dev/null
вывод grep
s будет добавлен к выводу ls -A
вместо его замены.
Используйте "тройник".
Пример:
grep someSearchString someFile | tee /dev/tty | wc -l > grepresult
Это отправит вывод команды grep как на терминал, так и на wc (чей вывод в свою очередь перенаправляется в файл grepresult).
"Тройник" объясняется в статье Википедии (команда). Центральное значение таково: «Команда tee читает стандартный ввод, затем записывает его содержимое в стандартный вывод и одновременно копирует его в указанный файл (ы) или переменные».