GNU/Linux >> Belajar Linux >  >> Linux

Apakah Subkulit Sama Dengan Cangkang Anak?

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.

Terkait:Mengarahkan output dari subkulit ke suatu proses?

Halaman manual yang relevan:fork(2), execve(2).


Linux
  1. Apakah Tanda Kurung Benar-benar Menempatkan Perintah Dalam Subkulit?

  2. Jalankan Perintah Sudo, Menentukan Kata Sandi Pada Baris yang Sama?

  3. Output Yang Akan Disimpan Dalam File Bernama Sama Dengan File Input?

  1. Apakah tar.gz dan tgz hal yang sama?

  2. Apakah proses tidur mendapatkan waktu CPU yang sama?

  3. Ping dan tcpdump secara bersamaan

  1. Jalankan Script Yang Sama Pada Beberapa Server Melalui Ssh?

  2. Bagaimana cara menghitung jumlah byte dalam sebuah file, mengelompokkan byte yang sama?

  3. Tidak dapat menemukan .so di direktori yang sama dengan executable?