Я немного запутался в том, как bash выполняет перенаправление каналов.
Сначала о поведении трубопровода:
cat /dev/random | ls
не ждет кота и заканчивается, как только ls результат выводится, однако cat /dev/random | grep foo
ждет cat перед выполнением grep. Это имеет смысл, потому что ls не нужен результат cat для работы, как это делает grep, но я не понимаю, как он может работать, bash ждет процессы с вызовами waitpid для некоторых процессов? Ожидает ли он EOF
на конце записи на правой стороне канала и на конце чтения на левой стороне канала?
Более того, я не уверен, какие команды разветвляются или нет, и где это делается. :
Я полагаю, встроенные команды выполняются в основном процессе, так как большинство из них используются для изменения некоторых настроек оболочки. С другой стороны (я полагаю), двоичный файл всегда выполняется в подпроцессе, с fork
, я прав? Если это так, это означает, что переадресация трубопровода не вызывает саму fork
, поскольку не знает, являются ли команды для выполнения встроенными или нет.
Bash исходный код слишком далек от мои навыки, я не понимаю, кто-то может объяснить мне, как он ведет себя?
Я пытался переопределить его поведение (без успеха), Я спросил здесь , с некоторым кодом, если вы хочу проверить.