Her işlem, işlemin ayrı ayrı ve diğer işlemlerden bağımsız olarak ayarlayabileceği çeşitli özelliklere sahiptir. Örnekler, kaynak sınırları, umask, geçerli dizin, ortam değişkenleri ve daha fazlasıdır. Süreç oluşturulduktan sonra ( fork()
sistem çağrısı yoluyla) çocuk bu öznitelikleri üst öğeden devralır. Bundan sonra, alt süreç bu nitelikleri keyfi olarak ayarlayabilir. (Bazı kısıtlamalar geçerlidir, bir işlem sabit kaynak sınırlarını artıramaz veya geçerli dizinini yürütme izni olmayan bir dizine değiştiremez.)
Sadece birkaç program ortam değişkenlerini değiştirir, çoğu rahatsız etmez. İkinci durumu varsayalım. Dolayısıyla, bir çocuk süreç kendini daha fazla çocuk yaratırsa, bu süreçler büyükbaba veya büyükanne ile aynı ortam değişkenlerine sahip olacaktır. Ve bunun gibi.
Şimdi, bir kabuğun çok sayıda değişkeni vardır set
(Bourne Kabuğu tipi kabuklarda, C Kabuğu hakkında bilmiyorum). Bu değişkenler, düzenlenmedikçe ortam değişkenleri değildir export
. Ortam değişkenleri ile görüntülenebilir env
. Kabuk komut satırından bir program başlatırsanız, program ortam değişkenlerini kabuktan devralır. Aynı şekilde bir kabuk betiğinden başlatılan bir program için.
Bu nedenle, girişte profil verilerini okuyan (örneğin ~/.profile
) bir kabuk vardır ve bunları neredeyse tüm çocuklara, torunlara vb. Ortam değişkeni ayarları, oturum açma kabuğunda veya oturum açma komut dosyasından oturum açma oturumunda başlatılan diğer tüm programlara bu şekilde damlar.
Bir terminal penceresinde bir ortam değişkeni oluşturdum ve başka bir terminal penceresinde yankılamaya çalıştım. Hiçbir şey göstermedi.
Yukarıdaki açıklama ile bu beklenen sonuçtur. Bir sürecin ortamındaki değişiklikler, bu sürecin şu an için yaratılmış olan çocuklarını etkiler, mevcut olanları değil.
$TEST=hello
Değişken genişletme devre dışı bırakılmamışsa veya $TEST
zaten uygun bir değere sahip değilse, bu zaten işe yaramaz . hello
Değişkene atamak TEST
istiyorsanız şunu söylemelisiniz TEST=hello
(not: hayır $
).
Bundan sonra ihraç ettim ve echo
farklı bir terminal penceresinde tekrar denedim . sonuç öncekiyle aynıydı.
Bir kez daha beklenen sonuç budur.
ancak oturum açmada aynı kodu çalıştırırsam (kodu ~/.profile
dosyaya ekleyerek ) değişkenler herhangi bir terminal penceresi kullanılabilir.
Bunun nedeni, terminaldeki kabuğun, ortam ayarlarını okuyan ~/.profile
ve bu ayarlardan devralınan kabuğun soyundan gelmesidir.