Когда подстановка команд порождает больше субоболочек, чем те же команды в изоляции?
Вчера мне предложили, что использование подстановки команд в 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?Существуют ли другие случаи, когда использование подстановки команд порождает подоболочку, в то время как выполнение одного и того же набора команд изолированно не будет?