PS1 = '$ (pwd)' neden işe yarıyor ve bu neden PS1 = $ (pwd) 'den farklı?


18

Neden bu komuta girdiğimde bilgi istemi dizinimde değişiyor?

PS1='$(pwd)'

Tek tırnak kullanıyorum, yani enterpolasyon yok, aka echo '$(pwd)'—— →$(pwd)

Dahası, bunun neden işe yaradığını açıkladığımızı söyleyin ... neden farklı çalışıyor PS1=$(pwd)? (hiç alıntı yok)

Farklı bir deyişle, eğer tırnakları kullanırsam, istemcinin içinde dolaşırken komut isteminin geçerli dizinimi değiştirmeye devam edeceğini kastediyorum. Ancak tırnak işareti kullanmazsam, komut her zaman komutu girdiğinizde bulunduğum dizin olarak kalırPS1=$(pwd)

neden?


2
Bazı CPU döngülerini kaydedin ve eşdeğer PS1 = '$ PWD' kullanın
jlliagre

Yanıtlar:


29

Bir değişkene basitçe bir değer atadığınızda, $(...)ifade tek tırnak içine alınmadıkça (veya ters eğik çizgiden kaçınırsa) ifade değerlendirilir. Anlamak için bu ikisini karşılaştırmaya çalışın:

A=$(pwd)
echo "$A"
B='$(pwd)'
echo "$B"

AHemen değeri dize olur /home/yourusernameve bu dizenin nereden geldiği hatırlanmaz, dizini değiştirseniz bile aynı kalır. BBununla birlikte, değeri $(pwd)yorumlanmadan gerçek dize olur .

Şimdi, PS1özel bir şeyin değerinde olur: bilgi istemi her yazdırıldığında, belirli özel yapılar yorumlanır, örneğin komut ikamesi $(...), tam olarak Adeğişken atamasında tam olarak gerçekleştiği şekilde gerçekleştirilir . Açıkçası PS1, ana dizininizin gerçek dizesini içeriyorsa (yukarıdaki gibi A) o zaman değişebilir. Ancak dizeyi içeriyorsa $(pwd)(yukarıdaki gibi B), bilgi istemi her yazdırıldığında değerlendirilir ve böylece gerçek dizininiz görüntülenir.


14

Hem bash hem de zsh'de değeri PS1olduğu gibi bir komut istemi olarak kullanılmaz, bazı genişletmelere uğrar. Kuralları iki kabuk için farklıdır, ama her iki durumda da, aşama bir normal kabuk sözdiziminde aynı sözdizimi “dolar” açılımlar (değişken ikame, komut ikamesi, aritmetik değerlendirme) gerçekleştirmek için ( , , ya da , , ) .$VARIABLE${VARIABLE}$(COMMAND)`COMMAND`$((EXPRESSION))$[EXPRESSION]

  • Bash'da dolar genişletme varsayılan olarak açıktır, ancak ile kapatılabilir shopt -u promptvars.
  • Zsh'de dolar genişletme varsayılan olarak kapalıdır, ancak birçok kişi (ve web'de bulacağınız çoğu yapılandırma çerçevesi) ile açılır setopt prompt_subst.

Bilgi isteminde dolar genişletme açıldığında , 6 karakterlik değere PS1='$(pwd)'ayarlanır ve bu nedenle değiştirilmeye neden olur ve bu nedenle kabuk her yeni bilgi istemi görüntülendiğinde yürütülecek komut oluşur. Öte yandan, o anda kabuğun geçerli çalışma dizini ne olursa olsun ayarlar . Eğer dolar genişletme kapalı olsaydı istemi değişmez dize olur .PS1$(pwd)$(pwd)pwdPS1=$(pwd)PS1PS1='$(pwd)'$(pwd)

Çalışma dizinini bilgi isteminde almanın daha kolay yolları olduğunu unutmayın:

  • Bash'da, ana dizininizi kısaltan ve ayarlanarak kesilebilen gibi ters eğik çizgi kaçışıyla .\w~PROMPT_DIRTRIM
  • Zsh olarak, bir ile yüzde kaçış gibi %/ya%~ ( %/aynıdır $PWD, %~ev dizinleri abbreviates) bir kırpma ayarı olabilir, hangi.
  • Her iki kabukta (ve herhangi bir Bourne tarzı kabukta) $PWDeşdeğerdir $(pwd): geçerli çalışma dizinini almak için bir alt işlem çalıştırmanız gerekmez.

7

Çünkü tırnak işaretleri olmadan, PS1 ayarlandığında $ (pwd) değerlendirilir. Tırnak işaretleri ile, $ (pwd) değeri bilgi istemi görüntülenene kadar ertelenir.

Tırnak işaretleri olmadan PS1, PS1 ayarlandığında geçerli dizine ayarlanır. Tek tırnakla PS1, $ (pwd) olarak ayarlanır; bu, komut istemi her görüntülendiğinde geçerli dizini değerlendirir ve yazdırır.

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.