Ortam değişkenlerindeki tek ve çift tırnakların önemi nedir?


19

Ben .profile bazı ortam değişkenleri şöyle tanımladı:

MY_HOME="/home/my_user"

ancak ben tırnak işaretleri ve dosyayı yeniden kaynak sürece ben değerlendirme gibi görünmüyor. Boşluk varsa tırnak işaretleri gerekli ve kaçış istenmiyorsa tek tırnak kullanılır inanıyorum. Birisi değişken tanımlarında tek ve çift tırnakların önemini açıklığa kavuşturabilir mi? Ön keneler ve arka keneler nasıl olur?

Yanıtlar:


23

Bence terminoloji konusunda kafan karıştı.

Bir "ortam değişkeni", yalnızca herhangi bir alt işlemin devralacağı bir kabuk değişkendir.

Örneğinizde yaptığınız şey bir kabuk değişkeni yaratmaktır. Dışa aktarılana kadar çevrede değildir:

MY_HOME="/home/my_user"
export MY_HOME

hemen hemen tüm mermilere "MY_HOME" adlı bir değişken koyar (csh, tcsh hariç).

Bu özel durumda, çift tırnaklar gereksizdir. Etkileri yok. Grup alt dizelerini çift tırnak içine alır, ancak değişken değiştirme yapmak için kullandığınız kabuğa izin verir. Tekli tırnak alt dizeleri gruplar ve ikameyi önler. Örnek atamanızda herhangi bir değişken bulunmadığından, çift tırnaklar tek tırnak olarak görünebilir.

V='some substrings grouped together'  # assignment
X="Put $V to make a longer string"    # substitution and then assignment
Y=`date`                              # run command, assign its output
Z='Put $V to make a longer string'    # no substition, simple assignment

Dışa aktarılana kadar çevrede hiçbir şey yok.


18

Kabuk değişkenleri ve ortam değişkenleri

MY_HOME="/home/my_user"adlı kabuk değişkenini ayarlar MY_HOME. Kabuklar programlama dilleridir ve değişkenleri vardır (parametreler olarak da adlandırılır). Bu atamadan sonra, değişkenin değerini kullanabilirsiniz;echo "$MY_HOME" .

Kabuk değişkenleri bir iç kabuk konseptidir. Bu kabuk örneği sona erdiğinde MY_HOMEunutulur. Her programın bildikleri ve çocuklarına ilettikleri ortam değişkenleridir .

Kabuğun içinde, ortam değişkenleri ve kabuk değişkenleri çok benzer şekillerde çalışır. Gerçekte olan şey, kabuğun üst öğesinden devraldığı tüm ortam değişkenlerinin kabuk değişkenleri haline gelmesidir. Tersine, bir kabuk betiğinde tanımlanan kabuk değişkeni, dışa aktarırsanız bir ortam değişkeni haline gelir .

export MY_HOME="/home/my_user"

İlk okumaya atlayabileceğiniz daha fazla ayrıntı

Kabuk değişkenlerinin otomatik olarak ortam değişkeni haline gelmemesinin nedeni, bir komut dosyasının yanlışlıkla başlattığı bir program için anlamlı olan ve kısmen de tarihsel bir değişken adı kullanabilmesidir.

exportDeğişken adını her değiştirdiğinizde çok eski kabukların kullanılması gerekir , ancak tüm modern kabuklar ortam değişkenleri için atamaları izler, böylece aşağıdaki snippet yankılanır bar:

myvar=foo
export myvar
myvar=bar
env | grep '^myvar='

Ayrıca, bazı çok eski mermiler myvar=foove için ayrı komutlar gerektiriyordu export myvar, ancak tüm modern mermiler anlıyor export myvar=foo.

Kaçabilirsiniz set -aböylece tüm kabuk değişken atamaları otomatik olarak değişken ihracat yapmaya myvar=fooeşdeğerdir export myvar=fookaçtın eğer set -aöncelikle bu kabukta.

Alıntı yapıldığında

Alıntı çoğunlukla diktir. Değişkene atadığınız değer kabuğa özel hiçbir karakter içermiyorsa, tırnak işaretine ihtiyacınız yoktur. Özel karakterler varsa, bunları tek tırnak veya çift tırnak veya ters eğik çizgi veya bunların bir kombinasyonu ile korumanız gerekir. Bu hem düz myvar=valuesözdizimi hem deexport yardımcı program için geçerlidir.

Atama sözdizimi ile sözdizimi arasında bir fark vardır export. Kabuk, değişken ikamelerin sonuçlarını $foodaha da genişleterek alan (kelime) bölme ve yol adı genişletme (globbing) gerçekleştirir . Bu, değeri myvarise hello ​ *, o zaman echo $myvaryazdırılır , ardından hellotek bir boşluk ve ardından geçerli dizindeki dosya listesi gelir. Bu dolayısıyla genel ilke, hemen hemen hiç arzu edilir hep değişken değiştirmelerin çift tırnak kullanmak (sen genişleme veya alan bölme pathname gerek biliyorum sürece): echo "$myvar". Basit bir atama söz konusu olduğunda, othervar=$myvargüvenilir kopyalar değerini aslında myvarhiçothervarçünkü globbing ve kelime bölme ödevlerde engellenir (çünkü birden fazla kelime oluştururlar, ancak tek bir kelime beklenir). exportBununla birlikte, bu dağıtım için geçerli değildir . Basit bir kuralı hatırlamak istiyorsanız, değişken ikamelerin çevresinde her zaman çift tırnak kullanın.


"Alıntı çoğunlukla diktir" diyebilir misiniz? bölümünde "Alıntıyla"? O cümlede dikgen anlamını anlamıyorum .
DK Bose

1
@DKBose Bir yandan çevre ile kabuk değişkenlerinin karşılaştırılması ve diğer yandan alıntı yapmanın birbiriyle çok az ilgisi olan iki ayrı sorun olduğu anlamına gelir. Vikisözlük anlamları 4 ve 5.
Gilles 'SO- kötü olmayı bırak'
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.