Yeni yazı: Kümeyi Kurmak: Ready Yazması Kümenin Çalıştığı Anlamına Gelmez
Mutlak Yol ve Bağıl Yol Kavramları

Mutlak Yol ve Bağıl Yol Kavramları

İç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.

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 pwd ile 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, mv ve > 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 pwd yazı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.

Paylaş :

İlgili Yazılar

Subnet Calculator

Subnet Calculator

Subnet, büyük bir IP ağını daha küçük, daha yönetilebilir parçalara bölen bir yapıdır. Alt ağlar, ağ trafiğini daha iyi yönetmek, güvenliği artırmak ve kaynakları daha verimli kullanmak için kullanılır. Her alt ağ, kendi benzersiz IP adres aralığına ve alt ağ maskesine sahip olabilir. Subnetler, ağdaki cihazların birbirleriyle doğrudan iletişim kurabilmeleri ve aynı alt ağda bulunan diğer cihazlara erişebilmeleri için bir köprü görevi görür. Alt ağlar, bir ağı daha küçük, daha ölçeklenebilir ve daha organize bir yapıya dönüştürerek ağ yöneticilerine daha fazla kontrol ve esneklik sağlar.

AlternativeTo Alternatif Yazılım Bulma

AlternativeTo Alternatif Yazılım Bulma

Günümüzde teknoloji dünyası hızla gelişiyor ve sürekli yeni yazılımlar, uygulamalar ve programlar piyasaya sürülüyor. Ancak bu kadar çok seçenek arasından en uygunu veya açık kaynak veya ücretsiz olanı bulmak bazen zor olabilir. İşte bu noktada AlternativeTo adlı muhteşem bir platform devreye giriyor. AlternativeTo, kullanıcıların ihtiyaçlarına en uygun yazılım alternatiflerini keşfetmelerine yardımcı olan bir web sitesidir.

Sanallaştırma Virtualization Nedir ?

Sanallaştırma Virtualization Nedir ?

Sanallaştırma, bir fiziksel makinenin işlemcisini, belleğini ve diskini birden çok bağımsız makineye bölmektir. Pratik sonucu şudur: bir sunucu satın alma kararı ile o sunucuda çalışacak sistemleri belirleme kararı birbirinden ayrılır — donanım geldikten sonra kaç makineye böleceğinize istediğiniz zaman karar verirsiniz.