Sembolik bir bağlantının hedefinin belirli bir yolu işaret etmesi


16

Bir bash betiği içinde, bir dosyanın aşağıdaki sözdizimiyle sembolik bir bağlantı olup olmadığını kontrol edebileceğimi biliyorum

if [ -L $path ]

Bu yolun belirli bir yola bağlı olup olmadığını nasıl test edeceğimi bilen var mı? Örneğin ben hedef olmadığını kontrol etmek istiyorum $patholduğunu /some/where.



2
Eğer bağlı demek musunuz tarafından belirli bir yolu? readlinkBilinen bir yolda bir tane yapıp test ettiğiniz yolla karşılaştıramaz mısınız?
Bratchley

@Bratchley. Evet, demek istediğim bu .. cevap için teşekkürler.
BillMan

2
Kesinlikle if [ -L "$path" ]iyi bir nedeniniz olmadığı ve ne yaptığınızı bildiğinizden emin olmadığınız sürece kabuk değişkenlerini her zaman tırnak işaretleri (örneğin, ) koymanızı öneririm.
G-Man,

@ G-Man büyük geri bildirim için teşekkürler .. bilinçaltında bunu biliyorum, ama pratikte unutmak .. takviye yardımcı olur.
BillMan

Yanıtlar:


22

$pathHedefi olan sembolik bir bağlantı olup olmadığını kontrol etmek istiyorsanız /some/where, readlinkyardımcı programı kullanabilirsiniz . POSIX değil, ancak birçok sistemde (GNU / Linux, BusyBox, * BSD,…) kullanılabilir.

if [ "$(readlink -- "$path")" = /some/where ]; then 

Bunun tam bir metin karşılaştırması olduğunu unutmayın. Bağlantının hedefi ise /some//whereveya wheredeğeri ve değeri $pathise /some/link, metinler eşleşmez.

Birçok sürüm, tüm sembolik bağlantıları genişleterek yolu kanonikleştiren readlinkseçeneği destekler -f.

Tire, ksh, bash ve zsh gibi birçok kabuk, iki dosyanın aynı olup olmadığını test etmek -efiçin testyerleşikteki operatörü destekler (sembolik bağlantıları izledikten sonra aynı dosyaya sabit bağlantılar). Bu özellik de yaygın olarak desteklenir ancak POSIX desteklenmez.

if [ "$path" -ef "/some/where" ]; then 

bağlantı göreceli bir yolu gösterdiğinde ilk örnek çalışmaz ...
inemanja

1
@inemanja Elbette öyle. Ama belirttiğim gibi, bu bir metin karşılaştırmasıdır. Aynı hedefe farklı yollarla farklı yollar uygular. Sembolik bağlantının hedefinin belirli bir yol yerine belirli bir dosya olup olmadığını sınamak istiyorsanız , aşağıda açıkladığım yöntemlerden birini kullanın.
Gilles 'SO- kötü olmayı bırak'

0

Göreli ve mutlak bir yolla ve bir yolun veya bağlantının sonunda "/" ile ilgili sorunları önlemek için:

if [ "$(realpath $(readlink -- "$path"))" = $(realpath /some/where) ]; then
    echo "Is"
else 
    echo "Is not"
fi

1
readlinkgerekli görünmüyorsa realpath, otomatik olarak sembolik bağlantıyı çözecektir.
Dagang
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.