Общие сведения
Канал – это важный механизм в ОС, который позволяет передавать данные от одного процесса к другому без сохранения чего-либо на диске.
В ОС есть два типа каналов: безымянные каналы и именованные каналы (FIFO).
Каналы используются путем объединения команд, разделенных символом канала |. Его часто называют конвейером и оболочка определяет его поведение.
Конвейер выполняет каждую команду в отдельном процессе, работающем в фоновом режиме, начиная с крайней левой команды.
Затем стандартный вывод команды с левой стороны подключается к стандартному вводу команды с правой стороны это обеспечивает однонаправленность потока.
Этот механизм действует до тех пор, пока не будут завершены все процессы в конвейере.
Оболочка использует маркер |& для ссылки на конвейер, соединяя как стандартный вывод, так и стандартную ошибку команды на левой стороне со стандартным вводом команды на правой стороне.
Например, если требуется использовать команду netstat, чтобы увидеть, какие процессы запущены с помощью localhost, и отфильтровать с помощью утилиты grep:
netstat -tlpn | grep 127.0.0.1
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
В этом примере вывода можно наблюдать как stdout, так и stderr скрипта в netstat независимо от фильтра.
Для объединения stderr в стандартный вывод и передачи его в stdin grep:
netstat -tlpn |& grep 127.0.0.1
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -