Ana içeriğe geç

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:

ali@ubuntu24:~$

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:

ali@ubuntu24:~$ echo ali
ali
ali@ubuntu24:~$

"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.

ali@ubuntu24:~$ hostname
ubuntu24
ali@ubuntu24:~$ whoami
ali
ali@ubuntu24:~$

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.

ali@ubuntu24:~$ !11
echo Ayrton Senna
Ayrton Senna
ali@ubuntu24:~$

!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ış. ls komutu - 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: ls kısmı komut. Devamında yer alan /boot kısmı ise bir argüman (argument). Bu sayede ls programına, hangi dizinin içeriğini listelemesini istediğimizi belirttik.
  • ls -l /boot: ls komutun kendisi. /boot ise argümanı demiştik. -l ifadesi ise, ls programı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:

komut opsiyon(lar) argüman(lar)

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.