Env, setenv, export ve ne zaman kullanılır arasındaki fark nedir?


18

Son zamanlarda ortam değişkenlerini ayarlamak için 3 seçeneğimiz olduğunu fark ettim:

  1. export envVar1=1
  2. setenv envVar2=2
  3. env envVAr3=3

Başka yollar varsa, lütfen bizi aydınlatın.

Ne zaman diğerini tercih etmeliyim? Lütfen yönergeler önerin.

Kabuk uyumluluğuna gelince, hangisi en geniş (daha fazla kabuk lehçesi kapsar)?

Bu yanıtı zaten fark ettim ama soruyu envve kullanım tercihi yönergelerini genişletmek istiyorum .

Yanıtlar:


15

export VARIABLE_NAME='some value'Herhangi bir POSIX uyumlu kabuk (bir ortam değişkeni ayarlamak için yöntemdir sh, dash, bash, ksh, vs .; da ZSH). Değişkenin zaten bir değeri varsa export VARIABLE_NAME, değerini değiştirmeden bir ortam değişkeni yapmak için kullanabilirsiniz .

POSIX Öncesi Bourne kabukları bunu desteklemedi, bu yüzden bunun yerine kaçınan export VARIABLE_NAME='some value've kullanan komut dosyaları göreceksiniz VARIABLE_NAME='some value'; export VARIABLE_NAME. Ancak POSIX öncesi Bourne mermileri günümüzde son derece nadirdir.

setenv VARIABLE_NAME='some value' bir ortam değişkeni ayarlamak için csh sözdizimidir. setenvsh'de mevcut değildir ve csh komut dosyalarında nadiren kullanılır ve son 20 yıldır interaktif kullanım için bash tarafından (ve daha uzun süre zsh) aşılır, böylece karşılaşmadığınız sürece unutabilirsiniz.

envKomut hariç çok nadiren yararlıdır mesele hatları . Bağımsız değişkenler olmadan çağrıldığında, ortamı görüntüler, ancak exportdeğerleri daha iyi yapar (sıralanan ve genellikle değerleri ayıran yeni satırlardaki değerlerde yeni satırları ayırmak için alıntılanır). Argümanla çağrılır, bu ekstra ortam değişkenleri ile bir komut çalışır, ancak olmadan aynı komutu envda (işleri VAR=value mycommandishal mycommandile VARkarşı kümesi valuegibi, env VAR=value mycommand). Bunun nedeni env, mesele satırında yararlıdırPATH arama ve bir komut adıyla çağrıldığında başka bir şey yapmaz. envKomut sadece birkaç ortam değişkenleri ile birlikte bir komutu çalıştırmak için yararlı olabilir-iveya kabuğun içe aktarmadığı geçersiz adlara sahip değişkenler de dahil olmak üzere ortamı görüntülemek için parametre içermez.


3

Aynı değişkente VAR='asdf'ortamın değiştirilmemesi gibi bir değişken belirlemek , aynı oturumda başlattığınız programların hiçbir şey bilmeyeceği VARve ona erişemeyeceği anlamına gelir. Kabuk komut dosyaları yazarken bu davranışı istiyorsunuz.

exportdiğer yandan, ortamı değiştiren ve böylece dışa aktarılan değişkeni geçerli oturumda ortaya çıkan alt işlemler için görünür kılan bir bash yerleşkesi. Aynı şeyi koşarak da başarabilirsiniz VAR='asdf' %program_name%.

envbir yerleşik değildir, kendi başına bir programdır. Yüzeyde tam olarak sizin gibi çalışır VAR='asdf' %program_name%, ancak daha düşük seviyede işler biraz daha karmaşıklaşır. İlk olarak, envlansman başladı. Ortamı değiştirir, ardından verilen bağımsız değişkenlerle komutu yürütür. Aynı davranışı exec (3) sistem çağrısını kullanarak kendi kodunuzda elde edebilirsiniz.

setenvexportcevabınızda belirtildiği gibi sadece csh-aile mermilerinde.


2
Modern kabuklarda, VAR=asdfçevrede VARzaten varsa ortamı günceller . (Bu orijinal Bourne kabuğunda doğru değildi.)
Gilles 'SO- kötü olmayı durdurun'

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.