Dolar işareti ve parantez içine bir komut koyduğumuzda kabukta ne anlama geliyor: $ (komut)


110

Ben sadece kabuktaki aşağıdaki kod satırını anlamak istiyorum. Mevcut çalışma dizinini almak için kullanılır. $(variable)Adın değişken adı içindeki değeri döndürdüğünün farkındayım , ama neyin $(command)dönmesi gerekiyor? Komutu çalıştırdıktan sonra değeri döndürüyor mu? Bu durumda `komutu çalıştırmak için kullanabiliriz .

CWD="$(cd "$(dirname $0)"; pwd)"

Kabuğun farklı sürümlerinde de aşağıdaki kod satırından aynı çıktı alınabilir

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

Ben anlamını anlamak alamıyorum $(cd..ve $(dirname.

Bu komutun nasıl yerine getirileceğini anlamama yardım eden var mı?


1
Ve burada avantajları / dezavantajları hakkında bir sorudur $()vs. ``: stackoverflow.com/questions/9449778/...
Yok

Yanıtlar:


115

$Benzeri kullanım, ${HOME}HOME değerini verir. Kullanımı $gibi $(echo foo)o değeri olarak bir kabuktaki ve karşılığında parantez içindeki her neyse çalıştırmak yollarla. Benim örneğimde, o foozamandan beri standart olarak echoyazacaksınfoo


37
Evet; $(...)ters tırnak kullanmaya çalışmaktan daha iyi bir komut yazmanın yoludur. Yazmayı düşünün: gcclib=$(dirname $(dirname $(which gcc)))/libters tırnak kullanmayı. Markdown'da bunu yapmanın zorluklarına girmeden önce bile, daha zordur çünkü iç içe geçmiş komutların arka alıntılarından kaçmak zorundasınız, oysa $(...)notasyona sahip değilsiniz .
Jonathan Leffler

7
Teknik $(echo foo)olarak, bir alt kabuk değil, bir komut ikamesi oluşturur. Diğer mevcut cevap bunu doğru anlıyor. Bence komut ikamesi bir alt kabukta çalıştırılıyor, ama yine de farklı kavramlar.
trysis

4
@trysis - komut ikamesi kesinlikle bir alt kabukta çalışır ve bu yüzden bunu dikkate almaya değer.
Eliran Malka

2
Ters işaretlerin $ () ile aynı sonucu verdiğini anlıyorum, ancak aradaki fark tamamen kozmetik mi? $ () 'ın daha okunaklı olması dışında birini diğerine kullanmak için bir neden var mı?
Mitchell Tracy

2
"$ Gibi $ (echo foo) kullanımı, bir alt kabukta parantez içinde ne varsa çalıştır ve bunu değer olarak döndürmek anlamına gelir." ... Bu kafa karıştırıcı, çünkü bu komut parantezlerden döndürülenleri çalıştırmayı$(echo foo) deneyecek , önce çalışacak, sonra çalıştırmayı deneyecek ve bu da bir hata veriyorecho foofoo
Muhasebeci M

21
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

Bu komutun nasıl yerine getirileceğini anlamama yardım eden var mı?

Komutun farklı bölümlerine bakalım. BASH_SOURCEkaynak dosya adlarını içeren bir bash dizisi değişkenidir. Böylece "${BASH_SOURCE[0]}"size komut dosyasının adını döndürecektir.

dirnamedosya adından son bileşeni kaldıran GNU coreutils tarafından sağlanan bir yardımcı programdır . Böylece betiğinizi söyleyerek çalıştırırsanız bash foo, "$( dirname "${BASH_SOURCE[0]}" )"geri dönecektir .. Eğer dediyse bash ../foo, o döneceğini ..; çünkü bash /some/path/foogeri dönecekti /some/path.

Son olarak, komutun tamamı "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"çağrılan komut dosyasını içeren mutlak dizini alır.

$(...) komut değişimine izin verir, yani bir komutun çıktısının komutun kendisini değiştirmesine izin verir ve yuvalanabilir.


1
Partiye 3 yıl geç kaldığım için kusura bakmayın ama açıklamanın neden işe yaradığını açıklar mısınız? dirnameÇalıştırılan dosyanın yolunu (mevcut çalışma dizinine göreceli veya mutlak) döndürür, cdpwd'yi o dizine değiştirir ve pwdgeçerli çalışma dizininin mutlak yolunu yazdırır dediniz . Ama neden katılıyorlar &&? Ve ne olacak DIReğer tutmak cdbaşarısız?
Hıristiyan

2
@Christian, hatalı bir dizine sahip olmak yerine boş olacak şekilde başarısız olursa, çalışmasını &&engeller . pwdcdDIR
Charles Duffy
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.