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?
sh -c
: podproces, który przypadkowo jest powłoką.bash -c <command>
, po rozwidleniu powłoki, a następnie jej wykonaniubash -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>
?Środowisko podpowłoki nie musi żyć w osobnym procesie, wystarczy powielić bieżące środowisko wykonawcze. W
ksh93
tym celuvirtual sub-shell
mechanizm, który nie wywołujefork()
. To sprawia, że ksh93 jest bardzo szybki na archaicznych platformach, takich jakWin-DOS
, ponieważWin-DOS
jest 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
sh
i twoja bieżąca powłoka są identyczne, nie powiela to środowiska wykonawczego, a zatem nie tworzysub-shell
.źródło
ksh93
podpowłoki jest powłoką podrzędną, prawda?