03- Shell ile Tanışma
Bir kullanıcı olarak, işletim sistemi ile etkileşime girmemizi sağlayan programlara genel olarak shell (kabuk) diyebiliriz. Shell denildiğinde aklımıza çoğu zaman CLI (Command Line Interface / Komut Satırı Arayüzü) gelir. Ancak işletim sistemini kullanmamızı sağlayan TUI (Text-based User Interface / Metin Tabanlı Kullanıcı Arayüzü) veya GUI (Graphical User Interface / Grafik Kullanıcı Arayüzü) de aslında birer shell'dir.
Fakat genel kullanımda, "shell" ile ifade edilen şey çoğu zaman CLI'dır.
Arayüzler Hakkında
İşletim sistemi kullanıcı arayüzleri hakkında biraz daha detaylı bilgi almak isterseniz şu yazımı inceleyebilirsiniz.
CLI Kavramı
Adı üzerinde, "komut satırı arayüzü". Birtakım komutlar yazarsınız ve bunları bilgisayarınıza gönderirsiniz. Kullandığınız CLI aracı, girdiğiniz komutu yorumlar ve uygun şekilde çalıştırmayı dener.
Linux sunucuları yönetirken, çoğu zaman CLI kullanacaksınız. Dolayısıyla kullandığınız CLI programına hâkim olmak, nasıl çalıştığını bilmek, davranışlarını tanımak, işinizi bir hayli kolaylaştıracaktır.
Bourne Shell (sh)
Unix'in 7. versiyonunda karşımıza çıkan shell'dir. Çalışmaları ilk olarak 1976'da başlamıştır. Bell Labs'da, Stephen Bourne tarafından geliştirilmiştir. Bourne, 1979'da kolej ve üniversitelere dağıtılan Unix 7 sürümünde yayınlandı. Etkileşimli bir komut yorumlayıcısı olarak kullanılmasına rağmen, aynı zamanda bir script dili olarak da tasarlanmıştı.
Bourne Again Shell (bash)
Hatırlarsanız, GNU projesi kapsamında pek çok Unix aracının özgür alternatiflerinin geliştirildiğinden bahsetmiştik. Bunlardan biri de Bash. 1989 yılında Brian Fox tarafından geliştirilmiştir.
Bash komut syntax'ı, Bourne syntax'ının bir üst kümesidir. Bu sayede Bash, Bourne shell scriptlerinin (kabuk betikleri) büyük çoğunluğunu herhangi bir değişiklik yapmadan çalıştırabilir. C shell (csh), T C shell (tcsh) ve Korn shell (ksh) gibi shell'lerden de esinlenmiştir. Neredeyse tüm modern işletim sistemlerinde kullanılabilir bir araçtır.
Yaygın kullanılan Linux dağıtımlarının büyük çoğunluğunda, GNU/Bash aracı varsayılan shell olarak gelmektedir. Biz de bu doküman serisi boyunca Bash shell'ini kullanarak yola devam edeceğiz.
Bash Prompt'u
Cihazınıza login olduğunuzda, kuvvetle muhtemel şöyle bir satır sizi karşılayacak:
Bu ifadeyi görüyorsanız, shell'iniz sizden komut almayı bekliyor diyebiliriz. Burayı bir inceleyelim isterim:
- "ali": Shell'i şu an kullanmakta olan kullanıcı adı.
- "ubuntu24": Kullanmakta olduğunuz cihazın adı.
- "@": Ayraç. User "ali" at "ubuntu24" machine. "ubuntu24" makinesindeki "ali" kullanıcısı. Evet, e-posta adresleriniz gibi. Evet, o makinelerde bir kullanıcısınız.
- ":": Ayraç. Sol tarafta bu bilgiler yer alıyorken, sağ tarafda şu an bulunduğunuz dizin gibi bilgiler yer alacak.
- "~": Path belirteci. İlgili kullanıcının ev dizininde (bu durumda /home/ali) olduğunuzu gösterir. "~" karakteri, Bash ortamında, ilgili kullanıcının ev dizinini ifade eder.
- "$": Yetki belirteci. "$" karakterini "S" harfine benzeterek, "standart" kullanıcı olduğunuzu düşünebilirsiniz. Bu, sistem yönetimi yetkileri olmayan bir kullanıcıyı ifade eder.
- "#": Şu an göremiyoruz ama, "$" yerine "#" karakterini gördüğünüzde, sistemdeki yetkili kullanıcı (varsayılan olarak "root") olduğunuzu anlayabilirsiniz.
Prompt Detayları
Prompt'unuzda gördüğünüz bu ifadeler, kullandığınız shell'e ve hatta o shell'in yapılandırma dosyalarına göre değişiklik gösterebilir. Yukarıda açıklanan ifadeler, GNU Bash version 5.2.21 için varsayılan olarak gelen yapılandırmaya göre açıklanmıştır. Bu ifadeler çoğu zaman doğru olacağı gibi; her shell'de ve her yapılandırmada %100 doğru olamazlar.
Bu prompt, Bash'in bazı yapılandırma dosyaları ile belirlenmiştir. Her sistemde ve her sürümde birebir aynı olmasını bekleyemeyiz. Ek olarak; kullanıcı adınız, bağlı olduğunuz sunucu gibi bilgileri alabilmeniz için farklı komutlar da vardır. Yani tek yol, bu prompt değildir.
Bash Kısayolları
Bash'e basit bir komut yazalım:
"echo" komutu, ekrana veri yazmak için kullanabileceğimiz bir komut. echo ali ile, ekrana "ali" yazdırdık. Komutumuz başarıyla çalıştı ve ekrana bir çıktı verdi. Sonrasında tekrar prmopt'a düştük. Yeni bir komut yazabiliriz.
Komut Çıktıları
Unix/Linux dünyasında, verdiğiniz komut ile ilgili her zaman bir çıktı görmeyebilirsiniz. "Yaptım", "bitirdim", "başardım, "oldu", "bitti" gibi mesajları çok sık göremeyebilirsiniz. Ancak bir hata odluğunda, bunu görürsünüz. Dolayısıyla, gelecekte kullanacağımız bazı komutlarda herhangi bir çıktı görmediğinizde, bir şeylerin ters gittiğini düşünmenize gerek yok. Verdiğiniz komut - çok yüksek ihtimalle - sorunsuzca çalışmıştır. İşini bitirip sessiz sedasız kenara çekilmiştir.
Bash'te Yön Tuşları
Sağ ve sol yön tuşları ile, yazdığınız satır içerisinde ileri-geri gezebilirsiniz. Yukarı ve aşağı yön tuşları ile, daha önce yazdığınız komutlar arasında geçiş yapabilirsiniz. Örneğin, yukarıdaki örneğin hemen ardından "Yukarı Ok" ve "Enter" tuşlarına basarsanız, bir önceki yazdığınız komut (echo ali) tekrar çalıştırılır.
Satırın Başı ve Sonu
Özellikle uzun komutlar yazmanız gereken zamanlarda, bazen yazdığınız komutu düzenlemek veya bir öncekine kıyasla ufak değişiklikler elde etmek isteyebilirsiniz. Bu tarz durumlarda, satırın başına gidebilmek için CTRL+A, satırın sonuna gitmek için ise CTRL+E kısayollarını kullanabilirsiniz.
Şimdi birkaç yeni komut ile devam edelim. Örneğin, hostname komutu ile, şu an bağlı olduğunuz makinenin ismini görebilirsiniz. whoami komutu ile, bağlı olduğunuz kullanıcı adını görebilirsiniz.
Otomatik Tamamlama
Bash'te TAB (Sekme) tuşunu kullanarak, yazdığınız komutların otomatik tamamlanmasını sağlayabilirsiniz. TAB'a bir kere bastığınızda, tamamlanabilecek olan tek seçenek otomatik olarak tamamlanır. Şayet bir kere bastığınızda tepki alamıyorsanız, bu durum tamamlanabilecek birden fazla seçenek olduğunu gösteriyor olabilir. Tekrar basın. Bu sayede tamamlanabilecek yeni ifadeler ile karşılaşırsınız. TAB'a defalarca basmanıza rağmen otomatik tamamlama gerçekleşmiyorsa, bunun birkaç sebebi olabilir. Yapmak istediğiniz işlemle ilgili yetkinizin olmaması, hatalı komut kullanımı veya kullanmak istediğiniz aracın otomatik tamamlama özelliklerinin yüklenmemiş olması; aklımıza gelebilecek ilk sebeplerdendir.
Aşağıdaki örneği inceleyin. w harfinden sonra 2 kere TAB tuşuna basılmış ve yeni seçenekler verilmiş. Devamında, wh harfleri yazılarak 2 kere TAB'lanmış ve yeni ihtimaller sıralanmış. Aynı durum, who ifadesi için de gerçekleştirilmiş. Son olarak whoa yazıp TAB'a basıldığında, whoami komutunun otomatik tamamlandığı görülüyor.
ali@ubuntu24:~$ w
w wakeuptime-bpfcc watch wc wget whereis which.debianutils whiptail whoami wipefs writeback.bt
wait wall watchgnupg wdctl whatis which while who wifi-status write
ali@ubuntu24:~$ wh
whatis whereis which which.debianutils while whiptail who whoami
ali@ubuntu24:~$ who
who whoami
ali@ubuntu24:~$ whoami
Örnek olarak birkaç komut daha yazalım. Bu çıktıların son satırına dikkat ediniz:
ali@ubuntu24:~$ echo Ayrton Senna
Ayrton Senna
ali@ubuntu24:~$ echo Niki Lauda
Niki Lauda
ali@ubuntu24:~$ echo Mika Hakkinen
Mika Hakkinen
ali@ubuntu24:~$ echo Lewis Hamilton
Lewis Hamilton
(reverse-i-search)`Sen': echo Ayrton Senna
echo komutu kullanılarak, birkaç efsanenin ismi ekrana yazdırılmış. En alt satırda göreceğiniz reverse-i-search ifadesi ise, bir komut araması yapıldığını gösteriyor. Daha önce yazdığınız komutun sadece bir parçasını hatırlıyorsanız ya da tamamını yazmak istemiyorsanız, bu özellikten faydalanabilirsiniz.
Reverse Search
CTRL+R kombinasyonu ile, tersine aramayı başlatabilirsiniz. Siz tuşlara bastıkça, arama kendi kendine gerçekleşecektir. Şayet aynı ifadenin geçtiği başka bir komutu arıyorsanız, bir kez daha (ya da bulana kadar) CTRL+R kombinasyonunu kullanabilirsiniz. İlgili komutu bulduğunuzda ise Enter tuşuna basarak çalıştırabilir ya da sağ veya sol yön tuşlarına basarak o komutu düzenleyebilir ve devamında Enter'a basarak komutu çalıştırabilirsiniz.
Bu örneği denerken, echo Ayrton Senna ifadesini göremediyseniz şuna dikkat edin. Arama yaparken sen değil, Sen ifadesini kullandım.
Case Sensitive
Linux dünyasında komutlar, dosya isimleri - hatta neredeyse her şey - büyük/küçük harfe duyarlıdır.
Son olarak bir kısayoldan daha bahsetmek istiyorum. Bunun için ise öncelikle history komutuna ihtiyacımız var. Bu komut, Bash'te daha önceden kullandığınız komutları gösterir.
ali@ubuntu24:~$ history
1 sudo shutdown now
2 bash --version
3 echo ali
4 whatis echo
5 hostname
6 whoami
7 echo Ayrton Senna
8 echo Niki Lauda
9 echo Mika Hakkinen
10 echo Lewis Hamilton
11 echo Ayrton Senna
12 whatis history
13 help history
14 history
Diyelim ki buradaki "11" numaralı komutu çalıştırmak istiyoruz. Bunun için ! karakterini kullanabiliriz. Aşağıdaki örneği inceleyin.
!11 komutu ile, "history" listesinde yer alan 11 numaralı komutu çalıştırmak istediğimizi belirttik. Devamında, 11 numarada yer alan echo Ayrton Senna komutunun çalıştırılacağı bize gösterildi. Ve o komut çalıştırıldı. Çıktı olarak karşımıza - beklediğimiz üzere - "Ayrton Senna" ifadesi geldi.
Bir Komutun Anatomisi
CLI kullanacak kişilerin, kullanacakları CLI'ın nasıl çalıştığını - ister istemez - iyi bilmeleri gerekir. Linux için Bash kullanırken de, bu anlayışla hareket etmeliyiz.
Bash'te yazılmış aşağıdaki komutları inceleyelim:
ali@ubuntu24:~$ ls
ali@ubuntu24:~$ ls /boot
config-6.8.0-79-generic grub initrd.img initrd.img-6.8.0-79-generic initrd.img.old lost+found System.map-6.8.0-79-generic vmlinuz vmlinuz-6.8.0-79-generic vmlinuz.old
ali@ubuntu24:~$ ls -l /boot
total 94640
-rw-r--r-- 1 root root 287600 Aug 12 10:33 config-6.8.0-79-generic
drwxr-xr-x 5 root root 4096 Sep 7 23:25 grub
lrwxrwxrwx 1 root root 27 Sep 7 23:25 initrd.img -> initrd.img-6.8.0-79-generic
-rw-r--r-- 1 root root 72465548 Sep 7 23:25 initrd.img-6.8.0-79-generic
lrwxrwxrwx 1 root root 27 Sep 7 23:25 initrd.img.old -> initrd.img-6.8.0-79-generic
drwx------ 2 root root 16384 Sep 7 23:14 lost+found
-rw------- 1 root root 9113656 Aug 12 10:33 System.map-6.8.0-79-generic
lrwxrwxrwx 1 root root 24 Sep 7 23:25 vmlinuz -> vmlinuz-6.8.0-79-generic
-rw------- 1 root root 15014280 Aug 12 10:35 vmlinuz-6.8.0-79-generic
lrwxrwxrwx 1 root root 24 Sep 7 23:25 vmlinuz.old -> vmlinuz-6.8.0-79-generic
ali@ubuntu24:~$
ls komutu, dosya ve dizinleri listeleyip onlarla ilgili birtakım bilgileri görmemizi sağlayan bir komut. Yukarıdaki çıktıyı adım adım incelemeye çalışalım:
ls: Komut. Tek başına. Yazılmış ve Enter'a basılmış.lskomutu - varsayılan olarak - bulunduğunuz dizinin içeriğini listeler. Bizim herhangi bir dosyamız olmadığı için de, hiçbir çıktı üretmemiş.ls /boot:lskısmı komut. Devamında yer alan/bootkısmı ise bir argüman (argument). Bu sayedelsprogramına, hangi dizinin içeriğini listelemesini istediğimizi belirttik.ls -l /boot:lskomutun kendisi./bootise argümanı demiştik.-lifadesi ise,lsprogramının çalışma şeklini değiştirmiş ve daha farklı şekilde bir listeleme yaptırmış. Bu ve bunun gibi ifadelere ise opsiyon (optiom) diyoruz.- Son olarak unutmamamız gereken bir karakter daha var: Boşluk. Bash'te komut, opsiyon(lar) ve argüman(lar) "boşluk" karakteri ile ayrılır.
Özetle bir komutun anatomisini şuna benzetebiliriz:
Ne Oluyor?
Yukarıdaki örnekte yer alan komuta, opsiyona ve argümana lütfen aldırış etmeyin. Genel konsepti anlamanız için bir örnek. Böyle şeylerin olduğunu ver bunların boşluklarla ayrıldığını öğrenmeniz şu an için yeterli. Her bir ifadeye ayrı ayrı zaten değineceğiz. Hatta Yardım Alma bölümünde, bu bilgilere nereden ve nasıl erişeceğinizi de konuşacağız.