Является ли вложенная оболочка тем же, что и дочерняя оболочка?

11

Есть два имени: подоболочка и дочерняя оболочка .

Да, дочерний процесс будет запущен любым из этого:

sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat

Все ли эквивалентны и имеют одно и то же имя? Все ли имеют одинаковые свойства?


POSIX имеет это определение :

Среда выполнения оболочки состоит из ....

Но последний абзац вышеуказанной ссылки имеет следующее:

Среда подоболочки должна создаваться как копия среды оболочки, за исключением того, что для ловушек сигнала, которые не игнорируются, должно быть установлено действие по умолчанию.

И специально:

Подстановка команд, команды, сгруппированные в круглых скобках, и асинхронные списки должны выполняться в среде подоболочек. Кроме того, каждая команда многокомпонентного конвейера находится в среде подоболочек; ....

Это sh -c 'echo "Hello"'не включено там, это также следует называть подоболочкой?

Жиль "ТАК - перестань быть злым"
источник

Ответы:

14

Подоболочка дублирует существующую оболочку. Он имеет те же переменные¹, те же функции, те же параметры и т. Д. Под капотом создается подоболочка с помощью forkсистемного вызова²; дочерний процесс продолжает делать то, что от него ожидается, в то время как родитель ожидает (например, $(…)) или продолжает свою жизнь (например, … &), или иным образом выполняет то, что от него ожидается (например, … | …).

sh -c …не создает подоболочку. Запускает другую программу. Эта программа оказывается оболочкой, но это просто совпадение. Программа может даже быть другой оболочкой (например, если вы запускаете sh -c …из bash и shdash), т. Е. Совершенно другой программой, которая, как оказалось, имеет значительное сходство в своем поведении. Под капотом запуск внешней команды ( shили любой другой) вызывает forkсистемный вызов, а затем execveсистемный вызов для замены программы оболочки в подпроцессе другой программой (здесь sh).

¹ Включая $$, но исключая некоторые специфичные для оболочки переменные, такие как bash и mksh BASHPID.
² По крайней мере, это традиционная и обычная реализация. Оболочки могут оптимизировать ответвление, если они могут имитировать поведение в противном случае.

Соответствующие справочные страницы: fork (2) , execve (2) .

Жиль "ТАК - перестань быть злым"
источник
Благодарю. К чему относится запуск скрипта bash с bash shebang?
Тим
@Tim То же самое, что и sh -c: это подпроцесс, который по совпадению оказывается оболочкой.
Жиль "ТАК - перестань быть злым"
(1) «запуск внешней команды (sh или любой другой) вызывает системный вызов fork, а затем системный вызов execve для замены программы оболочки в подпроцессе другой программой (здесь sh)». Правильно ли, что fork сначала создает подоболочку, а затем исполняет ее вместо внешней программы? Таким образом, в двух случаях в вашем ответе всегда создается подоболочка? (2) «подоболочка, которая дублирует существующую оболочку». что это обозначает?
Тим
(3) в bash -c <command>, после fork оболочки и затем execve bash -c <command>, создается оболочка bash. Затем системный вызов используется для <command>повторного запуска fork bash shell и execve <command>?
Тим
2
@cuonglm «Дочерняя оболочка» - это не технический термин с особым значением, в отличие от «подоболочки». Если это оболочка, которая является дочерней, то это дочерняя оболочка, следуя обычным правилам английского языка.
Жиль "ТАК - перестань быть злым"
1

Среда под-оболочки не обязательно должна находиться в отдельном процессе, она просто должна дублировать текущую среду выполнения. При ksh93этом делается virtual sub-shellмеханизм, который не вызывает fork(). Это делает ksh93 очень быстрым на архаичных платформах, как Win-DOS, например , Win-DOSочень медленным при разветвлении.

sh -c cmd с другой стороны создает новый процесс с оболочкой по умолчанию, который не обязательно должен совпадать с вашей текущей интерактивной оболочкой.

Даже если shваша текущая оболочка идентична, это не дублирует среду выполнения и, следовательно, не создает sub-shell.

Шили
источник
Итак, в других оболочках кроме ksh93subshell - это дочерняя оболочка, верно?
cuonglm
Я не знаю ни одной другой реализации, которая реализует виртуальные субоболочки сегодня.
Шили