$ (Pwd) veya $ PWD kullanmak daha mı iyi?


35

BASEDIR=$(pwd)Bir komut dosyasında karşılaştım .

Üzerinden üzerine yazmak yerine BASEDIR="$PWD", kullanımından başka bir avantaj veya dezavantaj var $PWDmı?



@ StéphaneChazelas Çok ilginç yazı. Sadece yarıya kadar devam edeceğim ve devam edeceğim, ancak anladığım kadarıyla, kullanımı daha iyi $(pwd), çünkü $PWDbazı durumlarda modası geçmiş olabilir.
Minix

2
sadece bazı mermilerde (örneğin bash, dash, zsh veya ksh93 pwddeğil $PWD) bazı köşe kasalarında olduğundan daha az bayat bilgi verir . $(pwd)Öte yandan, geçerli dizin yeni satır karakterleriyle bitiyorsa, işlem yapma anlamına gelir (ksh93 hariç) ve ek kaynaklar kullanır. Bence kullanımıdır $PWDarasında $(pwd -P), bu kullanarak değmez $(pwd).
Stéphane Chazelas 12:14

1
altta stephane kullanmaktan bahseder cd -P -- "$dir". Eğer değeri hakkında herhangi bir şüphe $PWDvarsa, her zaman cd -P .önce yapabilirsiniz . bu aynı zamanda ondan $PWDönce gelenleri almanız $OLDPWDve sonradan bunları karşılaştırabilmeniz için faydalı olabilir - ve bir sonraki cd ...; cd -sekans sizi şimdi olduğunuz yere geri getireceğinizden emin olacaktır.
mikeserv

Yanıtlar:


41

Bash karşılaşırsa $(pwd)pwd komutunu çalıştırır ve $(pwd)bu komutun çıktısı ile değiştirir . $PWDneredeyse her zaman ayarlanan bir değişkendir. pwd uzun zamandan beri yerleşik bir kabuk komutudur.

Bu yüzden $PWDeğer bu değişken ayarlanmazsa $(pwd)başarısız olur ve $()deneyimlerime göre olan yapıyı desteklemeyen bir kabuk kullanıyorsanız başarısız olur . Bu yüzden kullanırdım $PWD.

Her inek gibi kendi kabuk komut dosyası eğitimim var


6
`command`Sözdiziminin istenmeyen olduğu ve $(command)tercih edileceği izlenimi altındaydım . Bildiğim kadarıyla ikincisi POSIX uyumlu, ancak% 100 emin değilim.
Minix

6
@Minix The $()POSIX tarafından gerçekten belirtilmiştir, bu nedenle /bin/shSolaris 10 ve daha eski ve daha eski ve cshtüretilmiş mermilerde mevcut olan POSIX dışında, birçok diğer genel kabuğun bu özelliğe sahip olmadığından şüpheliyim.
jlliagre

@Minix: İşte bu sitede, backticks kullanımıyla ilgili bir sorunu gösteren son bir soru$()
PM 2Ring

doğru, $ () yerine backtick'leri kullanabilirsiniz, ancak bu basamaklandırılamaz, bu yüzden bahsetmedim
Thorsten Staerk

1
Öğreticinize güzel minimap ....
kbtzr

6

$PWDPerformansından dolayı istenen bir durumdan da bahsetmek gerekir . Bir kabuk değişkeni olarak neredeyse anında çözülebilir. $(pwd)biraz daha kafa karıştırıcı. Bash'li man 1 bulitinbir sistemi inceliyorsanız, pwdbunun yerleşik bir komut olduğunu göreceksiniz ve bunun bir değişkene erişmek kadar hızlı olacağına inanmanıza neden olabilir. Bununla birlikte, $()yapı içeride ne olduğuna bakmaksızın içeriğini çalıştırmak için her zaman yeni bir alt kabuk (yeni bir işlem) başlatır. Aynı şey backticks için de geçerli. Gerçekten, kıyasladığımda:

echo 'Benchmarking $(pwd)...'
time (for i in {1..1000}; do echo $(pwd) > /dev/null; done)
echo 'Benchmarking $PWD...'
time (for i in {1..1000}; do echo $PWD > /dev/null; done)

$(pwd)Arama için 1.52 saniye ve 0.018 saniye için alıyorum $PWD. Mümkün olduğunca alt kabukların ve ayrıca diğer yabancı işlemlerin gereksiz şekilde başlatılmasından kaçınılmalıdır. Diğer dillerde alışkın olabileceğiniz işlev çağrılarından çok daha pahalıdırlar.


Bu ilginç bir cevap, ancak kabuk komut dosyalarımdaki performans konusunda endişeli olup olmadığımı bilmiyorum. Ben de eğer sorgu sorgusu arasında PDW değişirse performansın nasıl değişeceğini merak ediyorum.
Minix

@Minix Ben betiğimi döngü gövdesi olacak şekilde değiştirdim echo $PWD; pushd ..; echo $PWD; popd( >/dev/nullher ifadeden sonra ek olarak ) ve 0,05 saniye sürüyor. Daha sonra yankı ifadelerini kaldırdım (yalnızca pushd / popd) ve 0.03 aldı. Yani başına düşen echo $PWDsüre hala 0,01 saniye idi. Benzer bir şey yaptım $(pwd)ve her döngü için 2,2 saniye sürdü, böylece $(pwd)çağrı başına 1,1 saniye .
markasoftware

Çok seçici olmamakla birlikte, bunun yerini alacak olan hesaplamanın $PWDyankı ifadelerinin değerlendirilmesinden önce arka planda yapılacağını hayal edebiliyorum . Ancak, açıkça, erişim $PWDhala önemli ölçüde daha hızlıdır, bu yüzden uyumluluk bir endişe değilse, bu kesinlikle birini seçmek için bir nedendir. Bunu iyice test ettiğiniz için teşekkür ederiz. :)
Minix
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.