Как удар рассматривает “>> ()”

Согласно связанному руководству Bash, Bash (начиная с версии 3.0 +) использование: "диалект Расширенного регулярного выражения (ERE)".

Больше информации о том диалекте может быть найдено здесь.

9
18.03.2015, 01:51
2 ответа

Вы можете увидеть foo , отображаемый до бара , после стержень или даже после подсказки, в зависимости от времени. Добавьте немного задержки, чтобы получить последовательное время:

$ echo foo > >(sleep 1; cat); echo bar; sleep 2 
bar
foo
$

PAR появляется немедленно, затем FOO через секунду, затем следующая подсказка через еще одна секунда.

Что происходит, так это то, что Bash выполняет замены процесса на заднем плане.

  1. Основной процесс Bash начинает подпульдую для выполнения Сон 1; Cat и устанавливает трубку к ней.
  2. Основной процесс Bash выполняет Echo Foo . Поскольку это не заполняет буфер трубы, команда ECHO завершается без блокировки.
  3. Основной процесс Bash выполняет эхо-бар .
  4. Основной процесс Bash запускает команду Сон 2 .
  5. Между тем, подполюс запускает команду Сон 1 .
  6. Через около 1 секунды сон 1 возвращается в подпроцесс. Подпрокат продолжает выполнять CAT .
  7. CAT копирует свой вход на свой выход (который отображается на экране) и возвращает.
  8. Подборщик закончил свою работу, он выходит.
  9. Через еще одна секунда Сон 2 Возвращает. Основной процесс оболочки завершается выполнением, и вы можете увидеть следующую подсказку.
9
27.01.2020, 20:06

Вам не нужно подстановку процессов, чтобы получить этот эффект. Попробуйте это:

( echo foo | cat & )

вы получите большой результат (без бара ; Я оставлю это как упражнение) и по той же причине. В обоих случаях CAT начинается как фоновая задача. В моей линии здесь это явный. В случае замещения процесса, это также явное - это отдельный процесс, прикрепленный к файловому дескриптору имени - но это, возможно, не так очевидно.

Детский процесс не обязательно прекращается до Bash , распечатывает следующую подсказку. И поскольку его вывод буферизован, он ничего не выводится, пока оно не заканчивается. В этот момент Bash только что напечатал $ на Стдерре, и теперь фоновый процесс выходит после печати Foo и новая линия.

3
27.01.2020, 20:06

Теги

Похожие вопросы