Общие сведения

Канал – это важный механизм в ОС, который позволяет передавать данные от одного процесса к другому без сохранения чего-либо на диске.

В ОС есть два типа каналов: безымянные каналы и именованные каналы (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 -