Bu form değişkeni nedir = $ (…)


9

Aşağıdakiler ne anlama geliyor:

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

Ben bu bölümle ilgileniyorum:

varible=$(...)

Parantezin bir alt süreci yürütmek için kullanıldığını biliyorum, ama ya birlikte kullanılırlarsa $?


3
Eğer bash kullanıyorsanız: aracılığıyla man sayfasına man bash
bakıp

Yanıtlar:


16

Bash kılavuzundan ( man bash):

   Komut Değiştirme
       Komut değiştirme, bir komutun çıkışının
       komut adı. İki form vardır:

              $ (Komut)
       veya
              `command`

       Bash, bir alt kabukta komut yürüterek genişletmeyi gerçekleştirir
       çevre ve komut yerine standart
       komutun çıktısı, sondaki yeni satırlar silinmiş olarak. Gömülü
       yeni satırlar silinmez, ancak sözcük sırasında kaldırılabilir
       bölme. $ (Cat dosyası) komut ikamesi,
       eşdeğeri ancak daha hızlı $ (<dosya).

(Bu için de geçerlidir tüm Bourne benzeri kabukları, yani sh, ksh, zsh, bashvb ve zshbu şekilde gömülü boş karakterlerden ile yakalama verilerine da yapabiliyor)

Komuta

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

betiğin bulunduğu dizinin adını (tüm ters eğik çizgileri ileri eğik çizgilere dönüştürürken) değişkene atar basedir. Standart hata akışına gönderilen hatalar, uyarılar veya diğer tanı mesajları terminalde görüntülenmeye devam eder ( $(...)yalnızca komutun standart çıktısını yakalar).

Kabuk, en içteki komut değiştirme işlemini gerçekleştirerek başlayacaktır:

echo "$0" | sed -e 's,\\,/,g'

Bunun çıktısı bir dize olarak verilir dirnameve çıktısı değişkene atanır basedir.

Çift tırnak, hiçbir kelime bölme veya dosya adı globbing yapılmayacağından emin olmak için vardır, aksi takdirde $0(yürütmek için kullanılan yolu içeren komut dosyasının adı) bir boşluk içerdiğinde komut dosyasının başarısız olduğunu veya garip çıktı ürettiğini görebilirsiniz. karakteri veya bir dosya adı globbing karakteri ( ?veya gibi *).

Genel olarak her zaman açılımları (değişken açılımlar, komut ikameleri ve aritmetik açılımlar) alıntılamak iyi bir fikirdir. Bunun neden iyi bir fikir olduğuna dair mükemmel bir açıklama için bu soruya ve cevaplarına bakın .

Komut dosyası şu şekilde çalıştırıldıysa

$ /usr/local/bin/script.sh

sonra basedirdeğerini alırsınız /usr/local/bin.

Veya Cygwin'de:

$ bash c:\\Users\\Me\\script.sh

sonra basedirdeğerini alırsınız c:/Users/Me. Bu durumda komut satırındaki çift ters eğik çizgi, yalnızca kabuktan tek ters eğik çizgiden kaçmaktır. Gerçek değeri $0olan c:\Users\Me\script.sh.

Başka kullanmadan aynı şeyi yapmanın bir yolu dirname, echove sedolur

basedir="${0//\\//}"
basedir="${basedir%/*}"

teşekkürler, bu yüzden temelde en iç parantez ayrıştırma başlar, değil mi? ve alıntılar neden kullanılıyor?
Max Koretskyi

@Maximus Doğru. Cevabımı daha fazla bilgi ile güncelledim.
Kusalananda

Belki de "Bourne benzeri tüm mermiler için geçerlidir" demelisiniz. Biraz daha net
Sergiy Kolodyazhnyy

@Serg, Bourne kabuğunun ( /bin/shSolaris 10 veya öncesi gibi) desteklemediğini unutmayın $(...).
Stéphane Chazelas

@ StéphaneChazelas Bunu dahil edeceğim.
Kusalananda

6

Bu demektir çalıştırmak içinde ne parantez bir de alt kabuğa ve dönüş bir şekilde bu değere davanız bu atamada, varible.


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.