Alt kabuk, çocuk kabuğu ile aynı şey midir?


11

Bu iki isim var: bir alt kabuk ve bir çocuk kabuğu .

Evet, bunlardan herhangi biri tarafından bir alt süreç başlatılacaktır:

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

Hepsi aynı mı ve aynı adı mı paylaşıyor? Hepsi aynı mülkü paylaşıyor mu?


POSIX bu tanıma sahiptir :

Bir kabuk yürütme ortamı ...

Ancak yukarıdaki bağlantının son paragrafında şunlar vardır:

Göz ardı edilmeyen sinyal tuzaklarının varsayılan eyleme ayarlanması dışında, kabuk ortamının bir kopyası olarak bir alt kabuk ortamı oluşturulacaktır.

Ve özellikle:

Komut ikamesi, parantezlerle gruplanmış komutlar ve eşzamansız listeler alt kabuk ortamında yürütülür. Ayrıca, çok komutlu bir boru hattının her komutu alt kabuk ortamındadır; ....

sh -c 'echo "Hello"'Orada dahil olmadığını da altkabuk çağrılmalıdır?

Yanıtlar:


14

Alt kabuk, varolan kabuğu çoğaltır . Aynı değişkenlere¹, aynı fonksiyonlara, aynı seçeneklere vb. forkSahiptir. Kaputun altında sistem çağrısı² ile bir alt kabuk oluşturulur ; çocuk süreci, ebeveyn beklerken (örn. $(…)) ya da ömrünü sürdürürken (örn. … &) ya da kendisinden bekleneni yaparsa (örneğin, … | …) kendisinden beklenenleri yapmaya devam eder .

sh -c …alt kabuk oluşturmaz. Başka bir program başlatır. Bu program bir kabuk, ama bu sadece bir tesadüf. Program farklı bir kabuk bile olabilir (örneğin, sh -c …bash'tan koşuyorsanız ve shtire ise), yani davranışında önemli benzerliklere sahip olan tamamen farklı bir program olabilir. Kapağın altında, harici bir komut (başlatılması shya da diğer herhangi bir) çağırır forksistem çağrıyı daha sonra execve, sistem çağrıyı yerine başka bir program (burada ile alt işlemi kabuk programı sh).

¹ Dahil $$ancak bash ve mksh yıllardan gibi bazı kabuk özgü değişkenleri hariç BASHPID.
² En azından, geleneksel ve olağan uygulama budur. Kabuklar, aksi takdirde davranışı taklit edebilecekleri takdirde çatalı optimize edebilirler.

İlgili kılavuz sayfaları: çatal (2) , yürüt (2) .


Teşekkürler. Bir bash betiği bash shebang ile çalıştırmak neye aittir?
Tim

@Tim Şununla aynı şey sh -c: Bu, tesadüfen bir kabuk olan bir alt işlemdir .
Gilles 'SO- kötü olmayı bırak'

(1) "harici bir komutun başlatılması (sh veya başka herhangi bir), çatal sistem çağrısını çağırır ve ardından alt işlemdeki kabuk programını başka bir programla değiştirmek için sistem çağrısını çağırır (burada sh)." Çatalın önce bir alt kabuk oluşturup ardından alt kabuğu harici programla değiştirmesi doğru mu? Peki cevabınızdaki iki durumda daima bir alt kabuk yaratılıyor mu? (2) "Varolan kabuğu çoğaltan bir alt kabuk." Bu ne anlama geliyor?
Tim

(3) içinde bash -c <command>, çatal çatal sonra ve sonra yürütmek bash -c <command>, bir bash kabuk oluşturulur. O zaman sistem çağrısı <command>tekrar bash kabuğunu çatallamak ve yürütmek için <command>mi kullanılıyor?
Tim

2
@cuonglm “Çocuk kabuğu”, “alt kabuk” un aksine, belirli bir anlama sahip teknik bir terim değildir. Bir çocuk olan bir kabuksa, o zamanki İngiliz kurallarını takip eden bir çocuk kabuğu.
Gilles 'SO- kötü olmayı bırak'

1

Bir alt kabuk ortamının ayrı bir işlemde yaşaması gerekmez, yalnızca geçerli yürütme ortamını çoğaltması gerekir. Gelen ksh93bu yapılır virtual sub-shellçağırmaz mekanizması fork(). Bu, ksh93'ü çatal Win-DOSgibi Win-DOSson derece yavaş olduğu gibi arkaik platformlarda çok hızlı hale getirir .

sh -c cmd diğer tarafta, varsayılan kabuğuyla, geçerli etkileşimli kabuğunuzla aynı olması gerekmeyen yeni bir işlem oluşturur.

shGeçerli kabuğunuz ve ne zaman aynı olsa bile , bu, yürütme ortamını çoğaltmaz ve dolayısıyla bir sub-shell.


Yani, diğer kabuklarda ksh93, alt kabuk bir çocuk kabuğu değil mi?
cuonglm

Bugün sanal alt kabukları uygulayan başka bir uygulama bilmiyorum.
schily
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.