Konsol Scriptinde Sembolik Bağlantıları Çözme Yöntemleri
Unix benzeri sistemlerde sembolik bağlantılar (veya symlink’ler) ile çalışmak bazen zor olabilir, özellikle de bir symlink’in hangi gerçek yola işaret ettiğini bulmak istediğinizde. Eğer bir shell script yazıyorsanız ve herhangi bir ara symlink’i çözdükten sonra hedefin tam yolunu belirlemeniz gerekiyorsa, doğru yerdesiniz. Bu blog yazısında, bunu verimli bir şekilde nasıl gerçekleştireceğimizi açıklayacağız.
Problemin Anlaşılması
Sizden foo
adında bir sembolik bağlantının bar
adında başka bir dizine işaret ettiği bir durumdan bahsedelim. cd foo
ve pwd
gibi komutlar çalıştırdığınızda, shell’iniz altında yatan yapıyı net bir şekilde göstermeyebilir, bu da hedefe giden tam yolu bulmayı zorlaştırır.
Örneğin:
ls -ld foo bar
drwxr-xr-x 2 greg greg 68 Aug 11 22:36 bar
lrwxr-xr-x 1 greg greg 3 Aug 11 22:36 foo -> bar
Eğer şunları çalıştırırsanız:
cd foo
pwd
Çıktı, yalnızca /Users/greg/tmp/foo
olur; bu, foo
‘nun gerçekten işaret ettiği gerçek yol olan /Users/greg/tmp/bar
‘ı bulmak için pek yardımcı olmaz.
Çözüm
Neyse ki, C programlamasına girmeden shell scriptinde symlink’leri çözmenize yardımcı olabilecek yerleşik komutlar vardır. İşte yapmanın yolu:
pwd
Komutunu Kullanma
pwd -P
komutu, sembolik bağlantıları çözerek mevcut çalışma dizinini yazdırmak için kullanılır ve hedefin mutlak yolunu sağlar. Aşağıdaki komutu çalıştırdığınızda:
pwd -P
Herhangi bir symlink’i çözdükten sonra tam yolu döndürecektir.
getcwd
Kullanımı
Bunu başarmanın bir diğer yolu, C’deki unistd.h
kütüphanesinden getcwd
fonksiyonunu kullanmaktır. Ancak, eğer script yazıyorsanız, bunun yerine shell komutlarına güvenebilirsiniz. getcwd
fonksiyonunun pwd -P
ile benzer bir davranış sergilediğini bilmekte fayda var.
Çözüm Fonksiyonu Oluşturma
Bu komutları bir fonksiyon içine alarak işinizi kolaylaştırabilirsiniz. İşte bir Bash shell’de basit bir resolve
fonksiyonu örneği:
resolve() {
# Sağlanan yolu kullan ve çöz
local target=$1
# `readlink -f` symlink'leri izler ve tam yolu döner
local full_path=$(readlink -f "$target")
echo "$full_path"
}
Örnek Kullanım
Artık fonksiyonu şu şekilde çağırabilirsiniz:
resolve "foo"
Bu, aşağıdaki çıktıyı döndürecektir:
/Users/greg/tmp/bar
Bu desen, shell script ortamınızda karşılaştığınız herhangi bir symlink’in tam yoluna erişmenizi sağlar.
Bonus: Kullanıcı Ana Dizini Yollarını Çözme
Eğer tilde notasyonunu (örneğin ~kullanıcıadı
) kullanarak ana dizinleri de çözmek istiyorsanız, Bash bir shell scriptinde bu yolları otomatik olarak genişletir, böylece bunu resolve
fonksiyonunuzla sorunsuzca birleştirebilirsiniz.
Sonuç
Shell scriptlerinde sembolik bağlantıları çözmek karmaşık olmak zorunda değil. pwd -P
komutunu kullanarak veya readlink
kullanan resolve
gibi bir yardımcı fonksiyon oluşturarak, hedefin tam yolunu etkili bir şekilde belirleyebilirsiniz. Bu beceri, Unix benzeri bir ortamda çalışan herkes için önemlidir ve scriptlerinizi çok daha sağlam ve bilgilendirici hale getirir.
Unutmayın, sembolik bağlantıları iyi yönetmek, dizin yapılarında dolaşırken veya karmaşık shell scriptleri yazarken zaman ve karmaşık durumları önleyebilir.