Есть два имени: подоболочка и дочерняя оболочка .
Да, дочерний процесс будет запущен любым из этого:
sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat
Все ли эквивалентны и имеют одно и то же имя? Все ли имеют одинаковые свойства?
POSIX имеет это определение :
Среда выполнения оболочки состоит из ....
Но последний абзац вышеуказанной ссылки имеет следующее:
Среда подоболочки должна создаваться как копия среды оболочки, за исключением того, что для ловушек сигнала, которые не игнорируются, должно быть установлено действие по умолчанию.
И специально:
Подстановка команд, команды, сгруппированные в круглых скобках, и асинхронные списки должны выполняться в среде подоболочек. Кроме того, каждая команда многокомпонентного конвейера находится в среде подоболочек; ....
Это sh -c 'echo "Hello"'
не включено там, это также следует называть подоболочкой?
sh -c
: это подпроцесс, который по совпадению оказывается оболочкой.bash -c <command>
, после fork оболочки и затем execvebash -c <command>
, создается оболочка bash. Затем системный вызов используется для<command>
повторного запуска fork bash shell и execve<command>
?Среда под-оболочки не обязательно должна находиться в отдельном процессе, она просто должна дублировать текущую среду выполнения. При
ksh93
этом делаетсяvirtual sub-shell
механизм, который не вызываетfork()
. Это делает ksh93 очень быстрым на архаичных платформах, какWin-DOS
, например ,Win-DOS
очень медленным при разветвлении.sh -c cmd
с другой стороны создает новый процесс с оболочкой по умолчанию, который не обязательно должен совпадать с вашей текущей интерактивной оболочкой.Даже если
sh
ваша текущая оболочка идентична, это не дублирует среду выполнения и, следовательно, не создаетsub-shell
.источник
ksh93
subshell - это дочерняя оболочка, верно?