Mutlak Yol ve Bağıl Yol Kavramları
- Murat Akpınar
- Linux öğrenme yolculuğu
- 10 Ağustos 2023
İçindekiler
Bir önceki yazıda kabuktaki ilk komutları çalıştırdık ve listenin en başına pwd‘yi koyduk. O komutu neden bu kadar öne aldığımızı burada açıklıyoruz.
Doğru yazılmış bir komut yanlış dizinde çalıştırıldığında hata vermez — sessizce yanlış dosyaya dokunur. rm eski.log her dizinde çalışır; hangi eski.log‘u sildiği ise tamamen o an nerede durduğunuza bağlıdır. Linux’ta bir dosyayı adlandırmanın iki yolu var ve ikisi arasındaki fark tam olarak budur: biri nerede durduğunuzu umursar, diğeri umursamaz.
Bu yazıda mutlak yol ile bağıl yolun nasıl çözümlendiğini, . .. ~ - işaretlerinin gerçekte ne anlama geldiğini ve doğru yolu yazdığınız hâlde yanlış dosyaya ulaştığınız üç durumu göreceğiz.
Aşağıdaki çıktılar bir test makinesinden alınmıştır; dizin adları ve kullanıcı adı sizin sisteminizde farklı olacaktır. Komutlar ve davranışlar gerçektir.
Nerede Durduğunuz Komutun Ne Yapacağını Belirler
Kabuğun her zaman bir çalışma dizini (working directory) vardır. Bu, kabuğun “şu an buradayım” dediği tek bir dizindir ve pwd ile sorulur:
pwd
/home/kullanici/proje
Bir komuta dosya adı verdiğinizde çekirdek şu tek kuralı uygular: yol / ile başlıyorsa kök dizinden, başlamıyorsa çalışma dizininden çözümlenir. Başka bir kural yok. cat rapor.txt yazdığınızda kabuk sihirli bir arama yapmaz, dosyayı sistemde aramaz; yalnızca çalışma dizinine bakar.
Buradan çıkan sonuç şu: bir komutun ne yapacağını anlamak için komutu okumak yetmez, komutun hangi dizinde çalıştığını da bilmeniz gerekir. Yazının geri kalanı bu cümlenin sonuçlarından ibaret.
Mutlak Yol: Kökten Başlayan Tek Adres
Mutlak yol / ile başlar ve kök dizinden hedefe kadar geçilen bütün dizinleri sırayla içerir:
cat /home/kullanici/proje/rapor.txt
Bu yolun tek bir özelliği vardır ve bütün değeri oradan gelir: çalışma dizini ne olursa olsun aynı dosyayı gösterir. /tmp‘den de, /var/log‘dan da, bir betiğin içinden de yazsanız sonuç değişmez. Yol uzundur ama belirsizlik taşımaz.
Bir yolun mutlak olup olmadığını anlamak için tek bakılacak yer ilk karakterdir. /etc/hosts mutlaktır. etc/hosts değildir — ve bu ikisi neredeyse hiçbir zaman aynı dosya değildir.
Bağıl Yol: Bulunduğunuz Dizine Göre Adres
Bağıl yol / ile başlamaz ve çalışma dizininin üzerine eklenerek çözümlenir. Çalışma dizini /home/kullanici/proje iken:
cat rapor.txt # → /home/kullanici/proje/rapor.txt
cat belgeler/rapor.txt # → /home/kullanici/proje/belgeler/rapor.txt
Kısalığı bir kolaylık değil, bir bağımlılıktır: yolun eksik kalan başlangıcını çalışma dizini tamamlar. Aynı bağıl yol, farklı bir dizinde çalıştırıldığında farklı bir dosyayı gösterir — ya da hiçbirini:
cd /tmp
cat rapor.txt
cat: rapor.txt: No such file or directory
Bu hatayı görmek iyi senaryodur. Kötü senaryo, /tmp içinde de rapor.txt adında bir dosyanın bulunmasıdır: komut çalışır, hata vermez ve yanlış dosyayı okur.
Yolun Yapı Taşları: nokta, çift nokta, tilde ve tire
Dört işaret yolların büyük kısmını oluşturur ve ikisi kabuğa, ikisi dosya sistemine aittir. Bu ayrım önemli.
. ve .. gerçek dizin girdileridir. Her dizinin içinde fiziksel olarak bulunurlar; ls -a ile görebilirsiniz:
ls -a veri
. .. raporlar
. bulunduğunuz dizin, .. bir üst dizindir. Çekirdek bunları doğrudan tanır, kabuğa ihtiyaç yoktur. Kök dizinin üstü yoktur; / içinde .. yine /‘dir:
cd /
cd ..
pwd
/
~ ve - ise kabuğun kısaltmalarıdır, dosya sisteminde karşılıkları yoktur. ~ kabuk tarafından ev dizininizin mutlak yoluna çevrilir (tilde expansion), cd - ise sizi bir önceki çalışma dizinine geri götürür ve gittiği dizini ekrana yazar:
cd /etc
cd /var/log
cd -
/etc
Kabuğun kısaltması olmaları şu tuzağı doğurur: tırnak içine aldığınız ~ genişlemez, düz metin olarak kalır.
echo ~/dosya.txt
echo "~/dosya.txt"
/home/kullanici/dosya.txt
~/dosya.txt
İkinci satırdaki değeri bir komuta verirseniz, komut adı ~ olan bir dizin arar ve bulamaz. Boşluk içeren yolları tırnaklamak zorunda kaldığınızda tilde’yi tırnağın dışında bırakın: ~/"Belgelerim/rapor.txt".
Aynı Dosyaya İki Yoldan Erişmek
Aşağıdaki iki blok aynı dosyayı okur:
# Mutlak yol: çalışma dizini önemli değil
cat /home/kullanici/proje/rapor.txt
# Bağıl yol: önce doğru dizine gidilir
cd /home/kullanici/proje
cat rapor.txt
İkinci blokta asıl işi yapan satır cat değil, cd‘dir. Bağıl yol kullanan her komut dizisinin görünmeyen bir ilk adımı vardır: doğru dizinde olduğunuz varsayımı. O varsayım tuttuğu sürece bağıl yol daha kısa ve daha okunaklıdır; tutmadığı anda ise yazının geri kalanındaki hatalar başlar.
Yanlış Yapınca Ne Oluyor
Üç durumda yolu doğru yazarsınız ve yine de beklediğiniz dosyaya ulaşamazsınız.
Dizindeki Betik “command not found” Veriyor
Bulunduğunuz dizinde çalıştırılabilir bir betik var, adını doğru yazıyorsunuz, kabuk bulamıyor:
ls -l yedek.sh
-rwxr-xr-x 1 kullanici kullanici 32 Aug 29 10:12 yedek.sh
yedek.sh
bash: yedek.sh: command not found
Sebep izin değil, yol. Tırnaksız ve eğik çizgisiz yazılan bir kelimeyi kabuk dosya olarak değil, komut olarak arar ve yalnızca PATH içindeki dizinlere bakar. Çalışma dizini güvenlik gerekçesiyle PATH‘te değildir — olsaydı, içine ls adında bir dosya bırakılan her dizin sizi kandırabilirdi.
Çözüm, kelimeyi yola dönüştürmektir. İçinde / geçen her şey yol olarak ele alınır:
./yedek.sh
calisti
./ burada dekorasyon değil; anlamı değiştiren kısımdır.
Sembolik Link İçinde cd .. Sizi Fiziksel Üst Dizine Götürmez
veri/2026 dizinine guncel adında bir sembolik link verelim ve içine girelim:
ln -s veri/2026 guncel
cd guncel
pwd
/home/kullanici/proje/guncel
pwd -P
/home/kullanici/proje/veri/2026
İki çıktı da doğrudur ve farklı soruları yanıtlar: pwd oraya nasıl geldiğinizi (mantıksal yol), pwd -P ise gerçekte nerede olduğunuzu (fiziksel yol) söyler. Bash bu ikisinden mantıksal olanı takip eder, dolayısıyla cd .. sizi veri‘ye değil, link’in bulunduğu dizine geri götürür:
cd ..
pwd
/home/kullanici/proje
Fiziksel üst dizin olan veri‘yi beklediyseniz iki dizin birden şaşmışsınız demektir. Fiziksel davranışı istiyorsanız cd -P guncel ile girin. Link’lerin bu ikili doğası bir sonraki yazının konusu; burada bilinmesi gereken, ..‘nın nereye çıkacağının dizine değil, oraya nasıl geldiğinize bağlı olması.
Servis Sizin Bulunduğunuz Dizinde Başlamıyor
Elle çalıştırdığınızda sorunsuz olan bir betik, servis olarak koşturulduğunda dosyayı bulamaz. Sebep betikte değil, betiğin başladığı yerdedir: systemd.exec(5)‘e göre WorkingDirectory= yazılmamış bir sistem servisi kök dizinden (/) başlar (kullanıcı örneğinde ise ilgili kullanıcının ev dizininden). Betiğin içindeki cat rapor.txt artık /rapor.txt‘yi arar.
Bu yüzden kural şudur: etkileşimli kabukta bağıl yol, otomatik çalışan her şeyde mutlak yol. Betik yazarken çalışma dizinini varsaymak yerine ya mutlak yol yazın ya da betiğin başında dizini kendiniz sabitleyin:
cd /srv/yedek || exit 1
|| exit 1 kısmını atlamayın — cd başarısız olursa betik durmaz, bir sonraki satır yanlış dizinde çalışır ki bu yazının en baştaki sorunudur.
Hangisini Nerede Kullanmalı
- Elle, terminalde çalışırken bağıl yol. Kısadır, yazım hatası azdır ve zaten
pwdile nerede olduğunuzu doğrulayabilirsiniz. - Betiklerde, servis tanımlarında ve zamanlanmış işlerde mutlak yol. Bu ortamlarda çalışma dizinini siz seçmezsiniz.
- Silen, taşıyan ve üzerine yazan komutlarda mutlak yol.
rm,mvve>yanlış hedefte geri alınamaz; fazladan yazılan on beş karakter bunun ucuz sigortasıdır.
Sonuç
- Mutlak yol, nereden çalıştırırsanız çalıştırın aynı dosyayı gösterir.
/ile başlar ve çalışma dizinine bakmaz; betiklerde ve servislerde tercih edilmesinin sebebi budur. - Bağıl yol kısadır ama bulunduğunuz dizine bağımlıdır. Aynı komut başka bir dizinde çalıştırıldığında ya farklı bir dosyaya dokunur ya da hiçbir şey bulamaz.
~ve-kabuğa,.ve..dosya sistemine aittir. Tırnak içine alınan~genişlemez;..ise sembolik link üzerinden girdiğinizde fiziksel üst dizine değil, geldiğiniz yere çıkar.- Şüphelendiğinizde
pwdyazın. Yol hatalarının çoğu yolun kendisinde değil, komutun hangi dizinde çalıştığı varsayımındadır.
Yol haritasında sırada aynı dosyaya iki ayrı isimden erişmek var: Symbolic Link ve Hard Link. Serinin tamamına GNU/Linux Öğrenme Yolculuğu sayfasından ulaşabilirsiniz.