“Export” komutunun kullanımı nedir?


12

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.

$TEST=hello

Bundan sonra ihraç ettim ve echofarklı bir terminal penceresinde tekrar denedim . sonuç öncekiyle aynıydı.

export TEST 

ancak girişte aynı kodu çalıştırırsam (kodu ~/.profiledosyaya ekleyerek ) değişkenler herhangi bir terminal penceresi kullanılabilir. Burada ne oluyor? Bir terminalde kod yürütmek ve oturum açarken aynı kodu yürütmek arasındaki fark nedir?

Yanıtlar:


26

exportdeğişken, alt işlem ortamlarına dahil edilecek bir şey yapar. Mevcut diğer ortamları etkilemez. Genelde, bir terminalde değişken belirlemenin ve otomatik olarak başka bir terminalde görünmesini sağlamanın bir yolu yoktur, ortam her işlem için kendi başına kurulur.

Bunu bilgisayarınıza eklemek .profile, ortamınızın her yeni oturum açışınızda bu yeni değişkeni içerecek şekilde ayarlanmasını sağlar. Bu yüzden bir kabuktan diğerine dışa aktarılmıyor, bunun yerine yeni bir kabuğa başlangıç ​​ortamını ayarladığında dahil etmesi talimatını veriyor.


1

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 $TESTzaten uygun bir değere sahip değilse, bu zaten işe yaramaz . helloDeğişkene atamak TESTistiyorsanız şunu söylemelisiniz TEST=hello(not: hayır $).

Bundan sonra ihraç ettim ve echofarklı 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 ~/.profiledosyaya ekleyerek ) değişkenler herhangi bir terminal penceresi kullanılabilir.

Bunun nedeni, terminaldeki kabuğun, ortam ayarlarını okuyan ~/.profileve bu ayarlardan devralınan kabuğun soyundan gelmesidir.

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.