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.
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.
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.
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.
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:
- Komut
envyeni bir işlem olarak yürütülür
env çevreyi değiştirir ve
- 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!
export key=valuegenişletilmiş sözdizimi olduğunu ve taşınabilir komut dosyalarında (yani#! /bin/sh) kullanılmaması gerektiğini unutmayın .