Jest podpowłoką to samo, co skorupa podrzędna

11

Istnieją dwie nazwy: podpowłoka i powłoka podrzędna .

Tak, proces potomny zostanie uruchomiony przez dowolną z następujących czynności:

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

Czy wszystkie są równoważne i mają tę samą nazwę? Czy wszystkie mają te same właściwości?


POSIX ma następującą definicję :

Środowisko wykonywania powłoki składa się z ....

Ale ostatni akapit powyższego linku ma to:

Środowisko podpowłoki zostanie utworzone jako duplikat środowiska powłoki, z tym wyjątkiem, że pułapki sygnałowe, które nie są ignorowane, powinny być ustawione na działanie domyślne.

A szczególnie:

Podstawianie poleceń, polecenia zgrupowane w nawiasach oraz listy asynchroniczne powinny być wykonywane w środowisku podpowłoki. Ponadto każde polecenie potoku z wieloma poleceniami znajduje się w środowisku podpowłoki; …

Nie sh -c 'echo "Hello"'ma tam zawartej, czy to też powinno się nazywać podpowłoka?

Gilles „SO- przestań być zły”
źródło

Odpowiedzi:

14

Podshell duplikuje istniejącą powłokę. Ma te same zmienne¹, te same funkcje, te same opcje itp. Pod maską tworzona jest podpowłoka z forkwywołaniem systemowym²; proces potomny wykonuje to, czego się od niego oczekuje, podczas gdy rodzic czeka (np. $(…)) lub kontynuuje swoje życie (np. … &) lub w inny sposób wykonuje to, czego się od niego oczekuje (np … | ….).

sh -c …nie tworzy podpowłoki. Uruchamia inny program. Ten program może być powłoką, ale to tylko zbieg okoliczności. Program może być nawet inną powłoką (np. Jeśli uruchamiasz się sh -c …z bash i shjest to kreska), tj. Zupełnie inny program, który akurat ma znaczne podobieństwa w swoim zachowaniu. Pod maską uruchomienie zewnętrznego polecenia ( shlub dowolnego innego) wywołuje forkwywołanie systemowe, a następnie execvewywołanie systemowe w celu zastąpienia programu powłoki w podprocesie innym programem (tutaj sh).

¹ W tym $$, ale wykluczając niektóre zmienne specyficzne dla powłoki, takie jak bash i mksh BASHPID.
² Przynajmniej taka jest tradycyjna i zwykła implementacja. Pociski mogą zoptymalizować rozwidlenie, jeśli mogą naśladować zachowanie w inny sposób.

Odpowiednie strony podręcznika : fork (2) , execve (2) .

Gilles „SO- przestań być zły”
źródło
Dzięki. Do czego należy uruchamianie skryptu bash z bash shebang?
Tim
@Tim To samo, co sh -c: podproces, który przypadkowo jest powłoką.
Gilles „SO- przestań być zły”
(1) „uruchomienie zewnętrznego polecenia (sh lub dowolnego innego) wywołuje wywołanie systemowe fork, a następnie wykonanie wywołania systemowego w celu zastąpienia programu powłoki w podprocesie innym programem (tutaj sh).” Czy to prawda, że ​​rozwidlenie najpierw tworzy podpowłokę, a następnie wykonuje zamianę podpowłoki na program zewnętrzny? Więc w dwóch przypadkach w odpowiedzi zawsze tworzona jest podpowłoka? (2) „Podpowłoka, która powiela istniejącą powłokę”. co to znaczy?
Tim
(3) w bash -c <command>, po rozwidleniu powłoki, a następnie jej wykonaniu bash -c <command>, tworzona jest powłoka bash. Czy następnie wywołanie systemowe służy do <command>ponownego uruchomienia rozwidlenia powłoki bash i wykonania <command>?
Tim
2
@cuonglm „Dziecko-skorupa” nie jest terminem technicznym o konkretnym znaczeniu, w przeciwieństwie do „podpowłoki”. Jeśli jest to powłoka, która jest dzieckiem, to jest to powłoka podrzędna, zgodnie ze zwykłymi zasadami języka angielskiego.
Gilles „SO- przestań być zły”
1

Środowisko podpowłoki nie musi żyć w osobnym procesie, wystarczy powielić bieżące środowisko wykonawcze. W ksh93tym celu virtual sub-shellmechanizm, który nie wywołuje fork(). To sprawia, że ​​ksh93 jest bardzo szybki na archaicznych platformach, takich jak Win-DOS, ponieważ Win-DOSjest bardzo wolny przy rozwidlaniu.

sh -c cmd z drugiej strony tworzy nowy proces z domyślną powłoką, która nie musi być taka sama jak bieżąca powłoka interaktywna.

Nawet kiedy shi twoja bieżąca powłoka są identyczne, nie powiela to środowiska wykonawczego, a zatem nie tworzy sub-shell.

schily
źródło
Więc w innych powłokach oprócz ksh93podpowłoki jest powłoką podrzędną, prawda?
cuonglm
Nie znam żadnej innej implementacji, która dziś implementuje wirtualne podpowłoki.
schily