Bir ortam değişkeninin şu anki değeri nasıl gösterilir?


24

Sistemimin çevresini kontrol ettiğimde, pek çok çevresel değişken ortaya çıkacak. Belirli bir değişkeni nasıl arayabilirim?

Okuduğum bir kitap şöyle diyor:

Bazen ortamınızdaki değişken sayısı oldukça büyür, o kadar ki, yalnızca bir taneyle ilgilendiğinizde görüntülenen değerlerin tümünü görmek istemezsiniz. Bu durumda, echobir ortam değişkeninin geçerli değerini göstermek için komutu kullanabilirsiniz .

Bunu bir Linux terminalinde nasıl yaparım?

Yanıtlar:


25

Sadece:

echo "$VARIABLENAME"

Örneğin, ortam değişkeni $HOMEiçin şunları kullanın:

echo "$HOME"

Hangi sonra benzer bir şey yazdırır:

/home/username

Düzenleme : Stéphane Chazelas'ın yorumuna göre , printenvyerine kullanırsanız daha iyi olabilir echo:

printenv HOME

4
Alıntıları unuttun (zsh veya rc / es sözdizimini ima etmediğiniz sürece). echodeğişkenin içeriğini dönüştürebildiği için komutun zayıf bir seçimidir. Aynı zamanda kabuk parametresinin içeriğini de çıkarır. Yani Bourne kabuğu kullanıyorsanız mutlaka aynı değil veya env için benzeri vars 1, *mesela. Ve bu yaklaşımı, adı kabuk değişkeni adı olarak geçerli olmayan env vars için kullanamazsınız.
Stéphane Chazelas 20:15

5
Ayrıca, aynı ada sahip birkaç çevre girişi varsa (Tamam, patolojik bir durum), hangisinin alacağına (genellikle ilki veya sonuncusu) bağlı olduğunu unutmayın. printenv VARhepsini gösterecektir (en azından GNU uygulaması için).
Stéphane Chazelas 20:15

9

Çalıştırarak:

printenv

Tüm ortam değişkenlerini göreceksiniz. Daha fazla bilgi için bir göz atabilirsiniz:

https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps


2
Aslında soruya cevap vermeye yaklaşmak, printenv variablenamesadece adlandırılmış değişkeni gösterecektir; örneğin, printenv  HOMEyaklaşık olarak aynı şeyi yapacak echo  "$HOME".
G-Man 'Monica'yı Yeniden Girin'

5

Her sürecin kendi ortam değişkenleri kümesine sahip olduğunu anlamak önemlidir.

Bir süreç çağırdığında fork()sistem çağrısı, ikinci süreç ( çocuk ilk (özdeş) ebeveyn (bu oluşturulur) kopya Eğer yığınlarının nasıl düşündüklerini bağlı hemen altında sadece bacanın üzerinde bulunduğu (ya da çevreyi içerir :-)- ancak unix / linux yığın büyür aşağı ) yüksek adresleri.

Genellikle, alt süreç daha sonra execve()(sanal) hafızasındaki her şeyi ortadan kaldıracak ve belirtilen ikili dosyadaki kod ve veri bölümlerinden yeniden oluşturacak olan sistem çağrısını çağırır .

Bununla birlikte, yığını yeniden yapılandırdığında , işlevi execve()çağırmadan önce çevreye ve argüman dizgilerini yığına (bu sırayla) önce kopyalar, main()işlevi çağırmadan önce (işlerin çoğu crt0bootstrap kodunda execve()döndürmeden sonra ( girişe) yapılır. İkilikte belirtilen nokta )).

execve()C kütüphanesinde sistem çağrısı için mevcut ortamı geçecek olan (yani ebeveyn ortamının bir kopyası), arayanı yerine (yani çocuğun ebeveyn çevresini miras alacağı) geçecek sarmalayıcılar vardır - bkz environ(7).

Komutu çalıştırmayı (kök olarak) deneyin ps axeww | less... bu size tüm işlemler için ortamı gösterecektir ! İlginç olanı, işlem kimliği 1'dir (yani initişlem - önyükleme sırasında çekirdek tarafından oluşturulan ilk işlem).

Belirli bir işlem için çevreye bakmak istiyorsanız (ve bunun işlem kimliğini biliyorsanız), komutu çalıştırmayı deneyin cat /proc/<PID>/environ( <PID>işlem kimliği ile değiştirmeyi deneyin ).

Bir işlemin yeterli ayrıcalıkları varsa, kendi yığınını yeniden yazabileceğini ve bu sayede ortamının ne olduğunu öğrenmeyi zorlaştırabilir - ps çıktısında bunun gibi bazı daemon işlemleri göreceksiniz.

Sadece (Builtin) komutunu kullanın kabuk sürecinde belirli ortam değişkeninin geçerli değeri bakmak istiyorsanız Ama sonunda, bütün bu gözleme, @chaos yukarıda söylediklerini aşağı kaynar echo "$<NAME>"değiştirilmesi ( <NAME>adıyla ilgilendiğiniz ortam değişkeni) ... aynı değişkenin başka bir işlemde farklı bir değere sahip olabileceğini veya hiç bulunmayabileceğini unutmayın.


1
(1) Bu eseçeneğin psve /proc/…/environözel dosyanın tüm sistemlerde bulunmayabileceğini unutmayın. (2) AFAIK, her Unix işleminde istifini yeniden yazma ve ortam değişkenlerini değiştirme ayrıcalığı vardır. (3) Daha fazla tartışma için, bkz. Ortam değişkenleri kime ait? ( Süper Kullanıcı'da ).
G-Man

Bazı sistemlerde, imtiyazsız bir sürecin, komut satırı argümanlarını ve ortamını, örneğin kökten çalışmayı "gizlemesini" engellemenin bir yolu psolduğunu düşündüm. bunu düşündüm.
Murray Jensen

@MurrayJensen, yüksek oy alan soruyla ilgili bazı tartışmalara göre, ps'deki argümanlarını “kıvırmak” hakkında sordum - ps'nin prosese orjinal olarak iletilen argümanları veya işlemden sonra değiştirilmiş bir kopyasını döndürdüğü POSIX'de belirtilmedi. başladı. Bazı sistemler (sanırım Solaris ??) ne olursa olsun orijinal argümanları gösteriyor. (İşte link.) Bu düşündüğünüz şey olabilir. :)
Wildcard

Bingo! Evet, elbette Solaris bunu "doğru" yapar :-) Tazeleme için teşekkürler ...
Murray Jensen

1

Aradığınızı alabilirsiniz export:

export | grep HOME

$HOMEDeğişkenin içeriğini gösterecektir .


1

eğer bir sürü değişken ayarlamak zorundaysanız:

  ( set -o posix ; set ) | sort >~/vars.before

onları ayarladıktan sonra:

  ( set -o posix ; set ) | sort >~/vars.after

ayarlanmış olanı göstermek yerine:

  comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'

Bu sayede çok yakında kendinizi bulacaksınız, cnf dosyalarında önceden tanımlanmış çok sayıda kabuk varyasyonu ile çalışmak.

  # ---------------------------------------------------------
  # cat cnf/qto.dev.host-name.cnf
  # [MainSection]
  # postgres_db_name     = dev_qto
  # postgres_db_host     = host-name
  #
  # call by: doParseCnfEnvVars cnf/qto.dev.host-name.cnf
  # ---------------------------------------------------------
  doParseCnfEnvVars(){

     cnf_file=$1;shift 1;
     test -z "$cnf_file" && echo " you should set the cnf_file !!!"

     INI_SECTION=MainSection

     ( set -o posix ; set ) | sort >~/vars.before

     eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
        -e 's/#.*$//' \
        -e 's/[[:space:]]*$//' \
        -e 's/^[[:space:]]*//' \
        -e "s/^\(.*\)=\([^\"']*\)$/export \1=\"\2\"/" \
        < $cnf_file \
        | sed -n -e "/^\[$INI_SECTION\]/,/^\s*\[/{/^[^#].*\=.*/p;}"`

     # and post-register for nice logging
     ( set -o posix ; set ) | sort >~/vars.after

     echo "INFO added the following vars from section: [$INI_SECTION]"
     comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'
  }
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.