Sortof, конвейер работает так: сначала он выполняет первую команду, а затем вторую в вашем случае.
То есть, давайте дадим A|B
команду. Тогда нет уверенности в том A
или B
начинает первым. Они могут начаться в одно и то же время, если имеется несколько процессоров. Канал может содержать неопределенный, но конечный объем данных.
Если B пытается прочитать из канала, но данные недоступны, B
будет ждать, пока данные не поступят. Если при B
чтении с диска B
может возникнуть та же проблема, и нужно дождаться окончания чтения с диска. Более близкая аналогия - чтение с клавиатуры. Там B
нужно будет ждать, пока пользователь наберет. Но во всех этих случаях B запускает операцию «чтения» и должен дождаться ее завершения. Но если B
это команда, для которой требуется только частичный вывод, A
то после определенного момента, когда B
уровень входного сигнала s достигнут A
, SIGPIPE будет уничтожен
Если A
попытка записи в канал и канал заполнен, A
необходимо дождаться освобождения некоторого места в канале. A
может иметь такую же проблему, если он пишет в терминал. Терминал имеет управление потоком данных и может контролировать скорость передачи данных. В любом случае, A
он запустил операцию записи и будет ждать, пока операция записи не закончится.
A
и B
ведут себя как сопроцессы, хотя не все сопроцессы будут взаимодействовать с каналом. Ни один из них не полностью контролирует другого.
-m
аргумент.