Непонимание проблем bash поведение труб - PullRequest
0 голосов
/ 15 апреля 2020

Я немного запутался в том, как bash выполняет перенаправление каналов.

Сначала о поведении трубопровода:

cat /dev/random | ls не ждет кота и заканчивается, как только ls результат выводится, однако cat /dev/random | grep foo ждет cat перед выполнением grep. Это имеет смысл, потому что ls не нужен результат cat для работы, как это делает grep, но я не понимаю, как он может работать, bash ждет процессы с вызовами waitpid для некоторых процессов? Ожидает ли он EOF на конце записи на правой стороне канала и на конце чтения на левой стороне канала?

Более того, я не уверен, какие команды разветвляются или нет, и где это делается. :

Я полагаю, встроенные команды выполняются в основном процессе, так как большинство из них используются для изменения некоторых настроек оболочки. С другой стороны (я полагаю), двоичный файл всегда выполняется в подпроцессе, с fork, я прав? Если это так, это означает, что переадресация трубопровода не вызывает саму fork, поскольку не знает, являются ли команды для выполнения встроенными или нет.

Bash исходный код слишком далек от мои навыки, я не понимаю, кто-то может объяснить мне, как он ведет себя?

Я пытался переопределить его поведение (без успеха), Я спросил здесь , с некоторым кодом, если вы хочу проверить.

...