Linux komut satırında hayatta kalma ipuçları — 1

Bu ve sonraki birkaç flood’da size Linux’u komut satırından çıkmadan etkin olarak kullanabilmek için gerekli araç ve konseptleri tanıtacağım.

İşletim sistemini komut satırından kullanmanın çok daha hızlı ve güçlü olduğunu duyar dururuz. Bu flood ile başlayacak seride bu önermeye destek sağlayacak araçları ve Linux özelinde bazı işletim sistemi fonksiyonlarını tanıyacağız.

İşletim sistemine komut verip yönetmek için bir kabuk (shell) kullanırız. Kabuğun girdileri almak için klavyeye ve çıktıları basabilmek için ekrana ihtiyacı vardır. Modern sistemlerde terminal emulator'lar (kısa hali ile terminal) bu işlevi yerine getirmektedir. Tarihsel olarak console adı verilen, klavye ile monitörden oluşarak seri porttan bilgisayara bağlanan özel tip terminaller de vardır. Modern sistemlerde komut satırından başlatılan Linux'ta Alt+F1, Alt+F2 komutları ile sanal konsollar arasında geçiş yapılabilir.

Popüler Linux dağıtımlarında kabuk olarak genellikle bash veya sh kullanılır. Kullanıcılar sistemde bulunan farklı kabuklardan istediğini seçebilirler. Sistemde bulunan bütün kabuklar /etc/shells dosyasında bulunur. Kullanıcılar ön tanımlı (default) olarak kullanmak istedikleri kabuğu /etc/passwd dosyasından ayarlayabilirler. Aşağıda flood kullanıcısı için kabuk /bin/sh, vagrant kullanıcısı için ise /bin/bash olarak ayarlanmıştır. Çalışma zamanında kabuk değiştirmek için geçiş yapılmak istenen kabuğun ismi yazılabilir.

Kabuk kullanıcının günlük yapacağı işlemleri kolaylaştırmaya çalışır. Örneğin kabuk, terminali her açışımızda dosya sisteminde çalışma klasörü olarak kullanıcının $HOME klasörüne gidip komutları beklemeye başlar. bash kabuğunda kullanıcının $HOME klasörünün altındaki .bashrc dosyasının sonuna kabuk başlatılırken yapılması istenenler eklenebilir. Değişikliklerin mevcut kabukta da uygulanması için source .bashrc komutu kullanılabilir. Aşağıda kabuğun başlaması istenen klasör /home/vagrant yerine /vagrant olarak değiştirilmiştir.

bash ve diğer kabuklar kullanıcının işletim sistemi ile iletişime geçerek program çalıştırması, çalıştırılan programın ekran çıktılarının gösterilmesi, kullanıcıdan programın çalışması sırasında girdi alabilmesi, programlara argüman geçirilmesi, ortam değişkeni (Environment Variable) aktarılması, başlatılan programın parent prosesi olarak çıkış kodunun raporlanmasını sağlarlar. Kabuk sıralanan bu işlemleri yapabilmek için çekirdeğe sistem çağrıları (system call) yapar dolayısıyla Linux çekirdeği ile kullanıcı arasında köprü kurar.

Kabukta tanımlı olan ortam değişkenleri env veya printenv komutu ile ekranda görüntülenebilir. Aşağıda benim test sistemimdeki bash kabuğunda bulunan ortam değişkenleri gösterilmiştir.

Yukarıdaki ekran görüntüsünde $SHELL değişkeninde kullanıcının kullandığı kabuğu, $HOME değişkeninde kullanıcının ana dizini, $USER değişkeninde kabuğa bağlı olan kullanıcı adı görülebilir.

Yine yukarıdaki ekran çıktısındaki $PATH değişkeni üzerinde durulmaya değerdir. Bu değişken dosya sisteminde bulunan çalıştırılabilir dosyaların klasörlerini içermektedir. Kabukta dosya sistemindeki tam yolunu vermeden ls yazdığımız zaman, kabuk PATH’te bulunan klasörlere teker teker bakarak içlerinde ls ismi ile çalıştırılabilir bir dosya olup olmadığına bakar, ilk bulduğu çalıştırılabilir dosyayı çalıştırır ve diğer klasörlere bakmaz. Aşağıda $PATH değişkeninin başına mevcut klasör eklenip klasörde bulunan dosyalar $PATH'e eklenmiştir.

PATH değişkeninde olmayan bir klasördeki çalıştırılabilir bir dosyayı çalıştırabilmemizin tek yolu o dosyanın dosya sistemindeki tam veya relatif yolunu sağlamaktır. PATH içinde bulunmayan /app klasörünün içindeki booking-generator programını çalıştırmak için kabuktan /app/booking komutunu verilir. Aynı şekilde içinde bulunulan klasördeki billing adlı programı çalıştırmanın yolu da ./billing olacaktır. İkinci örnekte bulunan . o an içinde bulunulan klasörü ifade eder. .. ise bir üst klasöre gitmek için kullanılır.

Son olarak kabuğun ve çalıştırılabilir programın Linux çekirdeğine yaptığı bütün sistem çağrılarını görebilmek için strace komutu kullanılabilir. İlerleyen flood'larda detaylı olarak ele alacağımız bu aracı $PATH'in nasıl çalıştığını gözlemlemek için kullanalım.

which ls komutunu vererek sistemde bulunan ls programının dosya sistemindeki tam yolu bulunabilir. Bu komutu strace ile vererek bash'in $PATH değişkeninde bulunan klasörlerde ls dosyasını teker teker aradığı görülebilir. Aşağıdaki çıktıda bu davranış gösterilmiştir.