Belirli bir örneği ele alalım. grep
Komut adında bir ortam değişkeni olarak kullanan GREP_OPTIONS
varsayılan seçeneklerini ayarlamak için.
Şimdi. Dosyanın test.txt
aş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.txt
geri dönecek
line one
Grep -v
seç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 -v
ulaşılamadı grep
.
Bu formu, yalnızca kullanılacak kabuk için bir değişken ayarlarken kullanmak for i in * ; do
istersiniz , ö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ı. export
bir bash yerleşiktir; VAR=whatever
bash sözdizimidir. env
bir yandan, kendi içinde bir programdır. Ne zaman env
denir, aşağıdaki şeyler olur:
- Komut
env
yeni bir işlem olarak yürütülür
env
çevreyi değiştirir ve
- argüman olarak verilen komutu çağırır.
env
Yöntem ile değiştirilir command
iş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). grep
Sü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 interpreter
yerine kullanılmaktadır #!/usr/bin/interpreter
. env
bir program için tam yol gerektirmez, çünkü değişkeni tıpkı bir kabuk gibi execvp()
arama yapan işlevi kullanır PATH
ve 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=value
genişletilmiş sözdizimi olduğunu ve taşınabilir komut dosyalarında (yani#! /bin/sh
) kullanılmaması gerektiğini unutmayın .