Ada dua nama ini: subshell dan child-shell .
Ya, proses anak akan dimulai dengan semua ini:
sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat
Apakah semuanya sama dan berbagi nama yang sama? Apakah semua memiliki properti yang sama?
POSIX memiliki definisi ini :
Lingkungan eksekusi shell terdiri dari ....
Tetapi paragraf terakhir dari tautan di atas memiliki ini:
Lingkungan subkulit harus dibuat sebagai duplikat dari lingkungan shell, kecuali bahwa perangkap sinyal yang tidak diabaikan harus diatur ke tindakan default.
Dan khususnya:
Substitusi perintah, perintah yang dikelompokkan dengan tanda kurung, dan daftar asinkron harus dijalankan dalam lingkungan subkulit. Selain itu, setiap perintah pipa multi-perintah berada dalam lingkungan subkulit; ....
Tidak sh -c 'echo "Hello"'
termasuk di sana, haruskah itu disebut subkulit juga?
sh -c
: itu adalah subproses yang kebetulan merupakan shell.bash -c <command>
, setelah garpu shell dan kemudian mengeksekusibash -c <command>
, shell bash dibuat. Lalu apakah panggilan sistem digunakan untuk menjalankan<command>
lagi garpu shell dan mengeksekusi<command>
?Lingkungan sub-shell tidak perlu hidup dalam proses terpisah, hanya perlu menduplikasi lingkungan eksekusi saat ini. Dalam
ksh93
hal ini dilakukan olehvirtual sub-shell
mekanisme yang tidak memanggilfork()
. Ini membuat ksh93 sangat cepat pada platform kuno sepertiWin-DOS
, karenaWin-DOS
sangat lambat dengan forking.sh -c cmd
di sisi lain membuat proses baru dengan shell default yang tidak harus sama dengan shell interaktif Anda saat ini.Bahkan ketika
sh
dan shell Anda saat ini identik, ini tidak menduplikasi lingkungan eksekusi dan dengan demikian tidak membuatsub-shell
.sumber
ksh93
, subshell adalah shell anak kan?