Yalnızca komut dosyası süresince bir ortam değişkeni nasıl ayarlanır?


127

Bash'de Linux'ta (Ubuntu 11.04), yalnızca komut dosyası süresince normal değişkenden farklı olacak bir ortam değişkenini geçici olarak ayarlamak mümkün müdür? Örneğin, bir kabuk komut dosyasında, HOME'u geçici olarak mevcut çalışma dizinindeki bir klasöre ayarlayarak ve ardından uygulamayı başlatarak HOME'a kaydeden bir uygulama yapmak.


5
Ayarın senaryo süresinin ötesine geçmesini istemeniz daha zor olurdu
Nemo

Yanıtlar:


120
VAR1=value1 VAR2=value2 myScript args ...

2
Bunu koşmak için kendim defalarca yaptım vblank_mode=0 glxgears. Çalışıyor, ancak aynı zamanda vblank_mode=0: command not foundçalıştırdıktan sonra diyor , oysa ön harcama envbuna neden olmuyor. [test ediyor ...] Görünüşe göre zsh bundan hoşlanmıyor (yine de doğru şekilde kullanıyor), ama bash buna uygun. Sanırım bundan sonra envyönteme geçeceğim .
Chinoto Vokro

2
betiklerle çalışır ama VAR1="hello" echo $VAR1hiçbir şey döndürmez mi?
Zibri

2
@Zibri, genişlemenin ne zaman gerçekleşeceği ile ilgili. Muhtemelen böyle bir şey yapabilirsiniz:VAR1="hello" bash -c 'echo $VAR1'
cybergrind

Bunun birden çok ortam değişkeni için bile mümkün olduğunu gösterdiği için oy verildi.
Binarus

70
env VAR=value myScript args ...

18
VeyaVAR=value myScript args ...
Rockallite

9
1. Nasıl olur PATH=$PATH:XYZ echo $PATH | grep XYZda herhangi bir çıktı olmaz? 2. Kullanmak ve kullanmamak arasındaki fark nedir env?
qubodup

18
çünkü kabuk , echo komutunu çalıştırmadan önce PATH değişkenini genişletir . Bu genişlemeyi ertelemelisin. Tek yol: PATH=$PATH:XYZ sh -c 'echo $PATH' | grep XYZ- tek alıntılar burada anahtar
glenn jackman

14
Kullanmak envve kullanmamak arasındaki fark nedir ?
Muhammed Nureldin

Bu,IFS=$'\n' for l in lines; do ... done
drevicko

31

Sadece koy

export HOME=/blah/whatever

komut dosyasında değişikliğin olmasını istediğiniz noktada. Her sürecin kendi ortam değişkenleri kümesi olduğundan, bu tanım, betik sona erdiğinde (ve bununla birlikte, değişen bir ortama sahip olan bash olgusu) otomatik olarak herhangi bir anlam ifade etmeyecektir.


11
Bu yanıltıcı. exportdeğişkeni alt kabuklara aktarır, ancak ana kabuğu kontrol etmez. "#! / Bin / sh" veya benzeri ile başlayan bir komut dosyası yazıyorsanız, ayarladığınız HERHANGİ değişken komut dosyası çıktığında kaybolur.
brightlancer

1
@brightlancer, bu doğru ama yazdığım hiçbir şeyle çelişiyor gibi görünmüyor. (Senaryonun bir arka plan sürecini başlatma olasılığı dışında, ama bence bu OP'nin karmaşıklık seviyesinin ötesinde ve sadece kafa karıştırıcı olacaktır).
hmakholm,

5
İhracat gereksizdir. Ayrıca, cevabınız yalnızca senaryosu bir yorumlayıcıyı çağırırsa işe yarar (#! / Bin / sh veya benzeri). Eğer "senaryosu" yoksa, ona söyledikleriniz senaryonun sonunun ötesinde de devam edecektir. Bu yüzden cevabınızın yanıltıcı olduğunu söyledim - doğru olabilir, olmayabilir ama kesinlikle gereksiz ve kafa karıştırıcı bir kısmı var çünkü birisinin aradığı gerekli unsurun "ihracat" olduğunu düşünmesine neden olabilir.
brightlancer

7
@brightlancer: OP'ın komut çağırır alt komut kendileri $ HOME bağlı olduğu takdirde ihracat gereklidir ve ben varsayalım cesaret edemedi o böyle değildi. Ayrıca, betiğin shebang satırı olmasa da, sadece yürütme bit kümesine sahip bir metin dosyası olsa bile, bash bir betiği çalıştırmak için bir alt kabuk oluşturur. Deneyin - komut dosyasındaki değişken atamalar, onu çağırdığınız kabukta görünmez. Yalnızca sourcekomut dosyası, komutu yazdığınız aynı kabuk tarafından yürütülecekse.
hmakholm,

4
@brightlancer: Betikten $HOMEçalıştırılan herhangi bir komut tarafından miras alınmak istiyorsa dışa aktarma gereklidir . Ve eğer yapmazsa ve ayarı $HOMEsadece senaryonun kendisinin yararına olacaksa, muhtemelen senaryoyu değiştirmesi daha iyi olacaktır, böylece başka bir şeye gönderme yapar $HOME.
Keith Thompson
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.