Set, export ve env arasındaki fark nedir ve ne zaman kullanmalıyım?


112

Sık sık bir bash betiği basacağım ve bir değişkeni belirlemenin birkaç yolu var:

key=value
env key=value
export key=value

Bir komut dosyası veya tek bir komutun içindeyken (örneğin, doğru Şarap önekini ayarlamak için bir şarap başlatıcısıyla bir değişkeni sık sık zincirleyeceğim) bunların tamamen birbirinin yerine geçebileceği görülüyor, ancak bu kesinlikle böyle olamaz.

Bu üç yöntem arasındaki fark nedir ve bana her birini özellikle ne zaman kullanmak istediğime dair bir örnek verebilir misiniz?

Kesinlikle VAR = ... `ve` export VAR = ... `arasındaki fark nedir? ama buna da nasıl envuyduğunu bilmek istiyorum ve her birinin yararlarını gösteren bazı örnekler de güzel olurdu :)


5
Bunun export key=valuegenişletilmiş sözdizimi olduğunu ve taşınabilir komut dosyalarında (yani #! /bin/sh) kullanılmaması gerektiğini unutmayın .
Simon Richter

Yanıtlar:


110

Belirli bir örneği ele alalım. grepKomut adında bir ortam değişkeni olarak kullanan GREP_OPTIONSvarsayılan seçeneklerini ayarlamak için.

Şimdi. Dosyanın test.txtaşağıdaki satırları içerdiği göz önüne alındığında :

line one
line two

komutu çalıştırmak grep one test.txtgeri dönecek

line one

Grep -vseçeneğini seçerseniz çalıştırırsanız , eşleşen olmayan satırları döndürür, böylece çıktı

line two

Şimdi seçeneği çevresel değişkenle ayarlamaya çalışacağız.

  1. Ayarlamayan ortam değişkenleri export, çağırdığınız komutların ortamında miras alınmaz.

    GREP_OPTIONS='-v'
    grep one test.txt

    Sonuç:

    line one

    Açıkçası, seçeneğe -vulaşılamadı grep.

    Bu formu, yalnızca kullanılacak kabuk için bir değişken ayarlarken kullanmak for i in * ; doistersiniz , örneğin, dışa aktarmak istemezsiniz $i.

  2. Ancak, değişken o belirli komut satırının ortamına geçirilir, böylece

    GREP_OPTIONS='-v' grep one test.txt

    beklenenleri geri getirecek

    line two

    Bu formu, başlatılan programın bu özel örneğinin ortamını geçici olarak değiştirmek için kullanırsınız.

  3. Bir değişkeni dışa aktarmak değişkenin kalıtımsal olmasına neden olur:

    export GREP_OPTIONS='-v'
    grep one test.txt

    şimdi döner

    line two

    Bu, daha sonra başlatılan işlemlerin bir kabukta kullanılması için değişkenleri ayarlamanın en yaygın yoludur.

  4. Bunların hepsi bashta yapıldı. exportbir bash yerleşiktir; VAR=whateverbash sözdizimidir. envbir yandan, kendi içinde bir programdır. Ne zaman envdenir, aşağıdaki şeyler olur:

    1. Komut envyeni bir işlem olarak yürütülür
    2. env çevreyi değiştirir ve
    3. argüman olarak verilen komutu çağırır. envYöntem ile değiştirilir commandişlemi.

    Örnek:

    env GREP_OPTIONS='-v' grep one test.txt

    Bu komut iki yeni işlemi başlatacak: (i) env ve (ii) grep (aslında, ikinci işlem ilki yerine geçecek). grepSüreç açısından bakıldığında , sonuç tam olarak aynı

    GREP_OPTIONS='-v' grep one test.txt

    Ancak, bu deyimi bash dışındaysanız veya başka bir kabuk başlatmak istemiyorsanız kullanabilirsiniz (örneğin, çağrı exec()yerine işlev ailesini kullanırken system()).

Ek not #!/usr/bin/env

Bu aynı zamanda deyim #!/usr/bin/env interpreteryerine kullanılmaktadır #!/usr/bin/interpreter. envbir program için tam yol gerektirmez, çünkü değişkeni tıpkı bir kabuk gibi execvp()arama yapan işlevi kullanır PATHve ardından komut çalıştırmasıyla kendi yerini alır . Bu nedenle, bir tercümanın (perl veya python gibi) yola "oturduğunu" bulmak için kullanılabilir.

Aynı zamanda mevcut yolu değiştirerek hangi python varyantının çağrılacağını etkileyebileceğiniz anlamına gelir. Bu, aşağıdakileri mümkün kılar:

echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
calibre

Calibre'yi başlatmak yerine,

I am an evil interpreter!

GREP_OPTIONS = '- v' grep one test.txt neden çalışıyor? '-V'den sonra bir noktalı virgül kullanması gerektiğini düşündüm (ancak denedim ve aslında işe yarıyor.)
Joe

2
Çünkü noktalı virgül ile iki ayrı bash komutu olarak yorumlanır; İlki değişkeni (dışa aktarmadan) ayarlar ve ikincisi dışa aktarılan değişkeni içermeyen bir ortamla başlar. Ancak, noktalı virgül olmadan, bu yerel bir ortam ayarlayarak önce gelen bir komuttur (grep).
Ocak

Tüm değişkenler nereden envgeliyor? Demek istediğim, yeni bir kabuk açtığınızda daima bir kaç değişkeniniz olur. Öyleyse bazı programlar exportbunları düzeltmiş olmalı , değil mi?
Pithikos

1
@Pithikos Environment değişkenleri "çevre kaynakları" ile belirlenir. Varsayılan olarak, bash sistem çapında bir bashrc (veya profile.d veya bash_profile) sağlayacaktır. Sonra kullanıcı ~ / .bashrc (ve / veya ~ / .bash_profile) kaynakları. Bu dosyalardan herhangi biri diğer komut dosyalarını kaynaklamak için bash komutları içerebilir, böylece sonuçta her yerden gelen ortam değişkenleri elde edebilirsiniz.
Eric

5
Ne hakkında set var=blah?
CMCDragonkai
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.