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.