Вы можете увидеть foo
, отображаемый до бара
, после стержень
или даже после подсказки, в зависимости от времени. Добавьте немного задержки, чтобы получить последовательное время:
$ echo foo > >(sleep 1; cat); echo bar; sleep 2
bar
foo
$
PAR
появляется немедленно, затем FOO
через секунду, затем следующая подсказка через еще одна секунда.
Что происходит, так это то, что Bash выполняет замены процесса на заднем плане.
Сон 1; Cat
и устанавливает трубку к ней. Echo Foo
. Поскольку это не заполняет буфер трубы, команда ECHO
завершается без блокировки. эхо-бар
. Сон 2
. Сон 1
. сон 1
возвращается в подпроцесс. Подпрокат продолжает выполнять CAT
. CAT
копирует свой вход на свой выход (который отображается на экране) и возвращает. Сон 2
Возвращает. Основной процесс оболочки завершается выполнением, и вы можете увидеть следующую подсказку. Вам не нужно подстановку процессов, чтобы получить этот эффект. Попробуйте это:
( echo foo | cat & )
вы получите большой результат (без бара
; Я оставлю это как упражнение) и по той же причине. В обоих случаях CAT
начинается как фоновая задача. В моей линии здесь это явный. В случае замещения процесса, это также явное - это отдельный процесс, прикрепленный к файловому дескриптору имени - но это, возможно, не так очевидно.
Детский процесс не обязательно прекращается до Bash
, распечатывает следующую подсказку. И поскольку его вывод буферизован, он ничего не выводится, пока оно не заканчивается. В этот момент Bash только что напечатал $
на Стдерре, и теперь фоновый процесс выходит после печати Foo
и новая линия.