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 $?
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 $?
Yanıtlar:
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%/*}"
/bin/shSolaris 10 veya öncesi gibi) desteklemediğini unutmayın $(...).
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.
varible=$(..)Denilen Komut ikamesi ve daha ama bir kabuk komutunu çalıştırın ve bir değişkene çıkışını saklamak veya yankı komutunu kullanarak geri gösterilecek 's araçları şey. Örneğin, tarih ve saati görüntüleyin:
echo "Today is $(date)"
ve bir değişkende saklamak için:
SERVERNAME=$(hostname)
Daha fazla bilgi için: https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/
man bash