Ada dua nama ini:subkulit dan kulit anak .
Ya, proses anak akan dimulai dengan salah satu dari ini:
sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat
Apakah semua setara dan memiliki 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 cangkang, kecuali jebakan sinyal yang tidak diabaikan harus disetel ke tindakan default.
Dan khususnya:
Substitusi perintah, perintah yang dikelompokkan dengan tanda kurung, dan daftar asinkron harus dijalankan di lingkungan subkulit. Selain itu, setiap perintah dari pipeline multi-perintah berada di lingkungan subkulit; ….
sh -c 'echo "Hello"'
tidak termasuk di sana, haruskah itu disebut subkulit juga?
Jawaban yang Diterima:
Sebuah subkulit duplikat cangkang yang ada. Ini memiliki variabel yang sama¹, fungsi yang sama, opsi yang sama, dll. Di bawah tenda, subkulit dibuat dengan fork
panggilan sistem²; proses anak melanjutkan untuk melakukan apa yang diharapkan darinya sementara orang tua menunggu (mis., $(…)
) atau melanjutkan hidupnya (mis., … &
) atau melakukan apa yang diharapkan darinya (mis., … | …
).
sh -c …
tidak membuat subkulit. Ini meluncurkan program lain. Program itu kebetulan adalah shell, tapi itu hanya kebetulan. Program ini bahkan mungkin merupakan shell yang berbeda (mis., jika Anda menjalankan sh -c …
dari bash, dan sh
is dash), yaitu, program yang sama sekali berbeda yang kebetulan memiliki kesamaan yang signifikan dalam perilakunya. Di bawah tenda, meluncurkan perintah eksternal (sh
atau lainnya) memanggil fork
panggilan sistem dan kemudian execve
panggilan sistem untuk mengganti program shell di subproses oleh program lain (di sini sh
).
Termasuk $$
, tetapi mengecualikan beberapa variabel khusus shell seperti BASHPID
bash dan mksh .
² Setidaknya begitulah penerapan tradisional dan biasa. Shell dapat mengoptimalkan garpu jika mereka dapat meniru perilaku sebaliknya.
Halaman manual yang relevan:fork(2), execve(2).