Сортоф, трубопровід працює так: він спочатку виконує першу команду, а потім другу команду у вашому випадку.
Тобто, давайте A|B
буде дана команда. Тоді немає впевненості в тому A
або B
починає першим. Вони можуть запуститися точно в той самий час, якщо є кілька процесорів. Труба може містити не визначений, але обмежений обсяг даних.
Якщо B намагається прочитати з труби, але даних немає, B
буде чекати, поки дані надійдуть. Якщо ви B
читали з диска, B
може виникнути така ж проблема і потрібно почекати, поки читання диска закінчиться. Більш близькою аналогією було б читання з клавіатури. Там B
потрібно буде чекати, коли користувач введе. Але у всіх цих випадках B розпочав операцію "читання" і повинен почекати, поки вона закінчиться. Але якщо B
команда така, що їй потрібен лише частковий вихід, A
то після певної точки, де B
досягнутий рівень входу, A
буде знищено SIGPIPE
Якщо A
намагається записати на трубу, і труба заповнена, A
потрібно зачекати, поки деяка кімната в трубі стане вільною. A
може виникнути така ж проблема, якби він писав до терміналу. Термінал має контроль потоку і може поміркувати темп передачі даних. У будь-якому випадку, до A
, він запустив операцію "запис" і буде чекати, поки операція запису завершиться.
A
і B
ведуть себе як спільні процеси, хоча не всі спільні процеси будуть спілкуватися з трубою. Ніхто не повністю контролює інше.
-m
аргумент.