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

92

Her sık ​​sık bir bash betiğini başaracağım ve bana bir değişken koymanın birkaç yolu var:

key=value
env key=value
export key=value

Bir komut dosyasının veya tek bir komutun içindeyken (örneğin, doğru Şarap önekini ayarlamak için genellikle bir Şarap başlatıcısıyla bir değişken zincirleyeceğim) bunlar tamamen birbirinin yerine geçebilir gibi görünüyor ancak kesinlikle vaka.

Bu üç yöntem arasındaki fark nedir ve özellikle her birini ne zaman kullanmak istediğimin bir örneğini verebilir misiniz?

Kesinlikle arasındaki fark nedir? 'VAR = ...' ve 'export VAR = ...'? ancak env 'nin buna nasıl uyduğunu bilmek istiyorum ve her birinin faydalarını gösteren bazı örnekler de güzel olurdu:)

    
sordu Oli 24.10.2012 11:34

1 cevap

92

Belirli bir örneği ele alalım. % Co_de% komutu, varsayılan seçenekleri ayarlamak için grep adlı bir ortam değişkeni kullanır.

Artık. % Co_de% dosyasının şu satırları içerdiği göz önüne alındığında:

line one
line two

GREP_OPTIONS komutunu çalıştırdığında

line one

test.txt seçeneğiyle grep çalıştırırsanız, eşleşen olmayan satırları döndürür, böylece çıkış

olacaktır.
line two

Şimdi seçeneği, bir çevre değişkeni ile ayarlamaya çalışacağız.

  1. grep one test.txt olmadan ayarlanan ortam değişkenleri, aradığınız komutların ortamında miras alınmayacaktır.

    GREP_OPTIONS='-v'
    grep one test.txt
    

    Sonuç:

    line one
    

    Açıkça, -v seçeneği export 'ye aktarılmadı.

    Bu formun yalnızca kullanılacak kabuk için bir değişken oluştururken kullanmak istediğinizde, örneğin -v 'sinde grep vermek istemezsiniz.

  2. Ancak, değişken o komut satırının ortamına aktarılır, böylece yapabilirsiniz

    GREP_OPTIONS='-v' grep one test.txt
    

    beklenen

    değerini döndürecek
    line two
    

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

  3. Bir değişkenin dışa aktarılması, değişkenin devralınmasına neden olur:

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

    şimdi döndürüyor

    line two
    

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

  4. Bunların hepsi bash'ta yapıldı. for i in * ; do bir bash yerleşiğidir; $i bash sözdizimi. Diğer taraftan export , kendi başına bir programdır. % Co_de% çağrıldığında, aşağıdaki şeyler gerçekleşir:

    1. VAR=whatever komutu yeni bir işlem olarak yürütülür
    2. env ortamı değiştirir ve
    3. argüman olarak verilen komutu çağırır. % Co_de% işlemi env işlemiyle değiştirildi.

    Örnek:

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

    Bu komut iki yeni süreci başlatacaktır: (i) env ve (ii) grep (aslında, ikinci işlem birinci olanın yerini alacaktır). % Co_de% sürecinin bakış açısından, sonuç tam olarak koşma ile aynıdır

    GREP_OPTIONS='-v' grep one test.txt
    

    Ancak, bash'ın dışındaysanız veya başka bir kabuk başlatmak istemiyorsanız bu deyimi kullanabilirsiniz (örneğin, env çağrısından ziyade env işlev ailesini kullanırken).

env üzerindeki ek not

Ayrıca, command ifadesinin grep yerine kullanılmasının nedeni de budur. exec() bir programın tam yolunu gerektirmez, çünkü system() değişkenini bir kabuk gibi yaptığı #!/usr/bin/env işlevini kullanır ve sonra komut çalıştırmasıyla yerine kendisini kullanır. . Böylece, yol üzerinde bir tercümanın (perl veya python gibi) nerede oturduğunu bulmak için kullanılabilir.

Ayrıca, geçerli yolu değiştirerek hangi python değişkeninin çağrılacağını etkileyebileceğiniz anlamına da 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

ile sonuçlanacak
I am an evil interpreter!
    
verilen cevap January 24.10.2012 12:21

Etiketlerdeki diğer soruları oku