Alt kabuk, orijinal kabuk işleminin neredeyse özdeş bir kopyası olarak başlar. Kaputun altında, kabuk fork
sistem çağrısı 1'i çağırır , kod ve hafızası kopyalanan 2 yeni bir işlem yaratır . Alt kabuk oluşturulduğunda, kendisiyle ebeveyn arasında çok az fark vardır. Özellikle, aynı değişkenlere sahiptirler. $$
Özel değişken bile alt kabuklarda aynı değeri korur: orijinal kabuğun işlem kimliğidir. Benzer şekilde $PPID
, orijinal kabuğun ebeveyni PID'dir.
Birkaç kabuk, alt kabuktaki birkaç değişkeni değiştirir. Bash BASHPID
, alt kabuklarda değişen kabuk işleminin PID'sine ayarlar . Bash, zsh ve mksh $RANDOM
, üst ve alt kabukta farklı değerler üretmek için düzenler . Ancak, bunlar gibi yerleşik özel durumlar dışında, tüm değişkenler alt kabuktaki orijinal kabuktaki aynı değere, aynı dışa aktarma durumuna, aynı salt okunur duruma vb. Sahiptir. Tüm işlev tanımları, diğer ad tanımları, kabuk seçenekleri ve diğer ayarlar da miras alınır.
Tarafından oluşturulan bir alt kabuk (…)
, yaratıcısıyla aynı dosya tanımlayıcılarına sahiptir. Alt kabuk yaratmanın diğer yolları, kullanıcı kodunu çalıştırmadan önce bazı dosya tanımlayıcılarını değiştirir; örneğin, bir borunun sol tarafı, boruya standart bir çıkışla bir alt kabuk 3'te uzanır . Alt kabuk aynı akım dizini, aynı sinyal maskesi vb. İle de başlar. Birkaç istisnadan biri, alt kabukların özel tuzakları devralmamasıdır: yok sayılan sinyaller ( ) alt kabukta yok sayılır, ancak diğer tuzaklar ( SİNYAL ) sıfırlanır varsayılan eyleme 4 .trap '' SIGNAL
trap CODE
Dolayısıyla bir alt kabuk, bir komut dosyasını çalıştırmaktan farklıdır. Bir komut dosyası ayrı bir programdır. Bu ayrı program tesadüfen aynı zamanda ebeveyn ile aynı tercüman tarafından yürütülen bir senaryo da olabilir, ancak bu tesadüf, ayrı programa ebeveynin iç verisi hakkında herhangi bir özel görünürlük vermez. Dışa aktarılmayan değişkenler dahili veridir, dolayısıyla alt kabuk komut dosyası için tercüman çalıştırıldığında , bu değişkenleri görmez. Dışa aktarılan değişkenler, yani ortam değişkenleri, yürütülen programlara iletilir.
Böylece:
x=1
(echo $x)
1
alt kabuk, onu oluşturan kabuğun bir kopyası olduğu için yazdırır .
x=1
sh -c 'echo $x'
Bir kabuğun bir kabuğun alt işlemi olarak çalıştırılması gerekir, ancak x
ikinci satırın x
ikinci satırın ondan daha fazla bağlantısı yoktur .
x=1
perl -le 'print $x'
veya
x=1
python -c 'print x'
1 İstisna, ksh93
çatalın optimize edildiği ve yan etkilerinin çoğunun öykündüğü kabuktur.
2 Anlamsal olarak onlar kopyadır. Uygulama açısından bakıldığında çok fazla paylaşım var.
3 Sağ taraf için, kabuğa bağlıdır.
4 Bunu test ederseniz, bunun gibi şeylerin$(trap)
orijinal kabuğun tuzaklarını rapor edebileceğini unutmayın . Ayrıca birçok kabuğun, tuzak içeren köşelerde sıkıntılara sahip olduğunu unutmayın. Örneğin, ninjalj , bash 4.3'ten itibaren, “iki alt kabuk” kasasındaki iç içe geçmiş alt kabuktanbash -x -c 'trap "echo ERR at \$BASH_SUBSHELL \$BASHPID" ERR; set -E; false; echo one subshell; (false); echo two subshells; ( (false) )'
gelen ERR
tuzağı çalıştırdığını , ancak ERR
ara alt kabuktaki tuzağın değil - set -E
seçeneğininERR
tüm alt kabuklara tuzak takın, ancak ara alt kabuk uzağa optimize edilmiştir ve bu yüzden ERR
tuzağını çalıştırmak için orada değildir .
x=out; (x=in; echo $x)
)