Когда подстановка команд порождает больше субоболочек, чем те же команды в изоляции?

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

# Extra subshell spawned
foo=$(command; echo $?)

# No extra subshell
command
foo=$?

Насколько я могу понять, это кажется правильным для этого варианта использования. Однако быстрый поиск, пытающийся это проверить, приводит к множеству запутанных и противоречивых советов. Кажется, популярная мудрость гласит, что ВСЕ использование подстановки команд порождает недоработку. Например:

Подстановка команд распространяется на вывод команд.Эти команды выполняются в подоболочкеи их стандартный вывод - это то, к чему расширяется синтаксис замещения. (источник)

Это кажется достаточно простым, если вы не продолжите копать, и в этом случае вы начнете находить ссылки на предположения, что это не так.

Подстановка командне обязательно вызывает подоболочкуи в большинстве случаев не будет. Единственное, что он гарантирует, это неупорядоченная оценка: сначала он просто оценивает выражения внутри подстановки, а затем оценивает окружающее выражение, используя результаты подстановки. (источник)

Это кажется разумным, но так ли это?Этот ответ на вопрос, связанный с недоработкой, предупредил меня, чтоman bash имеет это к сведению:

Каждая команда в конвейере выполняется как отдельный процесс (т. Е. В подоболочке).

Это подводит меня к основному вопросу.Что именно заставит подстановку команд порождать подоболочку, которая в любом случае не была бы создана для выполнения тех же команд изолированно?

Пожалуйста, рассмотрите следующие случаи и объясните, какие из них несут накладные расходы на дополнительную подоболочку:

# Case #1
command1
var=$(command1)

# Case #2
command1 | command2
var=$(command1 | command2)

# Case #3
command1 | command 2 ; var=$?
var=$(command1 | command2 ; echo $?)

Каждая из этих пар требует одинакового количества подоболочек для выполнения? Есть ли разница в реализации POSIX против bash?Существуют ли другие случаи, когда использование подстановки команд порождает подоболочку, в то время как выполнение одного и того же набора команд изолированно не будет?

Ответы на вопрос(2)

Ваш ответ на вопрос