Kiedy podstawianie poleceń powoduje pojawienie się większej liczby podpowłok niż te same polecenia w izolacji?

Wczoraj zasugerowano mi, że używanie podstawiania poleceń w bashu powoduje pojawienie się niepotrzebnej podpowłoki. Porada była specyficznaten przypadek użycia:

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

# No extra subshell
command
foo=$?

Jak najlepiej potrafię to zrozumieć, wydaje się, że jest to właściwe dla tego przypadku użycia. Jednak szybkie wyszukiwanie, próbując to zweryfikować, prowadzi do ryzykownych i sprzecznych porad. Wydaje się, że powszechna mądrość mówi, że WSZYSTKIE użycie podstawiania komend spowoduje pojawienie się podpowłoki. Na przykład:

Podstawienie komendy rozszerza się na wyjście komend.Polecenia te są wykonywane w podpowłoce, a ich dane standardowe są tym, do czego rozwija się składnia podstawiania. (źródło)

Wydaje się to dość proste, chyba że nadal będziesz kopać, w którym to przypadku zaczniesz znajdować odniesienia do sugestii, że tak nie jest.

Podstawianie poleceńniekoniecznie odwołuje się do podpowłokiiw większości przypadków nie. Jedyne, co gwarantuje, to ocena poza kolejnością: po prostu najpierw ocenia wyrażenia wewnątrz podstawienia, a następnie ocenia oświadczenie otaczające, używając wyników podstawienia. (źródło)

Wydaje się to rozsądne, ale czy to prawda?Ta odpowiedź do pytania związanego z podpowłokąman bash ma to do odnotowania:

Każde polecenie w potoku jest wykonywane jako oddzielny proces (tj. W podpowłoce).

To prowadzi mnie do głównego pytania.Co dokładnie spowoduje, że podstawianie poleceń wywoła podpowłokę, która i tak nie zostałaby utworzona, aby wykonać te same polecenia w izolacji?

Proszę wziąć pod uwagę następujące przypadki i wyjaśnić, które z nich powodują narzut dodatkowej podpowłoki:

# Case #1
command1
var=$(command1)

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

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

Czy każda z tych par ma taką samą liczbę podpowłok do wykonania? Czy istnieje różnica w implementacjach POSIX vs. bash?Czy istnieją inne przypadki, w których używanie podstawiania poleceń wywoła podpowłokę, w której nie będzie działać ten sam zestaw poleceń w izolacji?

questionAnswers(2)

yourAnswerToTheQuestion