Terminal Komutu Nasıl Çalışır
Terminalimizi güzelleştirdik, ls
komutunu kullandık ve en çok kullandığımız komutlar için kısayol,
yani alias
tanımladık. Ancak hala bu ls
komutunun nasıl ve ne şekilde çalıştırıldığını
bilmiyoruz. Bu bölümde herhangi bir komutun nerede barındığına ve nasıl çalıştırıldığına
değineceğiz.
Terminal Komutu Nerede?¶
Fish ve bash gibi yazılımların birer metin arayüzü olduğunu tekrar hatırlatalım. Bizim büyük bir bilgisayar ile etkileşmemizi sağlıyorlar ve modern dünyada yaşadığımız için biz bunu hala emüle ediyoruz. Burada sormamız gereken soru bu komutlar nerede ve nasıl bulunup çalıştırıldıkları.
Bunun cevabı sabit disk. ls
gibi komutlar sabit disk üzerinde duruyor ve öncesinde gördüğümüz
gibi bir çıktı veriyorlar.
Bu ls
uygulamasının, (şimdilik komutunun demeyelim, metin tabanlı uygulama diyelim ki aklımıza daha net otursun), nerede olduğunu which
uygulaması ile görebiliyoruz.
Bu da demek oluyor ki ls
yazdığımızda /usr/bin/ls
çalıştırılıyor. Bu dosya tipinin ne olduğunu
da file
uygulaması (komutu) ile görebiliyoruz.
❯ file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), ...
↑
|
Buradaki çıktı sizin sisteminizde farklılık gösterecektir ancak önemli olan burada executable
satırını görmek. Yani bu bir uygulama. Terminalimize ls
yazdığımızda /usr/bin/ls
çalıştırılıyor.
Peki terminalimiz bunu nasıl buluyor?
Her seferinde which
çalıştırıp, uygulamanın nerede olduğunu bulup, ona göre hareket edebilir ancak
bu sefer de which
komutunu nasıl bulacağı sorusu ile karşı karşıyayız. Tavuk - yumurta problemi
yani. Demek ki elimizde başka bir yöntem olması gerekli.
Bunun için terminalimiz ortam değişkenleri kullanıyor.
Ortam Değişkenleri¶
Başı dolar işareti ($) ile başlayan değişkenler. Terminal içerisinde echo
komutu ile görülebilir. Örneğin ev dizininiz öntanımlı olarak $HOME
değişkenine atanıyor.
Atanmış bütün ortam değişkenlerini env
komutu ile görüyoruz. Aşağıda en sık kullanılan ve önem arz
edenleri listeledim. Sizde daha fazla çıktı görülecektir.
❯ env
...
...
USER=eren
PWD=/home/eren.linux
LANG=C.UTF-8
SHELL=/usr/bin/fish
HOME=/home/eren.linux
TERM=xterm-256color
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
|
|--> sihir burada
Terminalin bir uygulamayı bulurken yaptığı şey çok basit. $PATH
içerisinde :
karakteri ile
ayrılmış dizinlere sırası ile, teker teker bakıyor ve bulmaya çalışıyor. Bulduğu ilk
uygulamayı çalıştırıyor. Bu da demek oluyor ki /usr/local/__sbin__
ve /usr/local/__bin__
içerisinde aynı isimde uygulama varsa öncelikle /usr/local/sbin
içerisindeki çalıştırılacak.
Burada absolute path
ve relative path
konusuna da değinmemiz gerekli. Terminalimiz bir komut
yazdığımızda her daim $PATH
değişkenine bakarak karar veriyor. Bu durumda ikinci sırada yer alan
uygulamayı çalıştırmak için tam path
vermemiz, yani /usr/local/sbin/uygulamaismi
şeklinde
kullanmamız lazım. Relative path
ise o an bulunduğumuz dizine göre, başında /
olmadan
verdiğimiz path anlamına geliyor. Konu hakkında daha detaylı bilgi için
Redhat belgesine göz atabilirsiniz.
cd komutu üzerine
cd
komutu disk üzerinde değil, terminal emülatörünün kendi içerisinde olan bir komut ve o anki
çalışma dizinini değiştiriyor ($PWD). Bunun için ayrı bir uygulamaya gerek yok ve shell kendi
içerisinde bunu sağlamakta. Bu yüzden which
ile cd
komutunu bulamıyoruz çünkü disk üzerinde
değil, öntanımlı bir komut.
Uygulamayı Bulduk, Sonra?¶
Özetle, shell birtakım hazırlıklar yaptıktan sonra Linux kerneline bu uygulamayı çalıştır şeklinde bir sistem çağrısı (syscall) gönderiyor (execve). Linux kerneli uygulamayı diskten okuyup RAM'e yüklüyor ve sonrasında RAM'de nerede yer alıyorsa oradan çalıştırmaya devam ediyor. Uygulama işini bitirdikten ve çıktıktan sonra tekrar shell'e dönüyor.
Tabii ki bu çok basitleştirilmiş bir anlatım oldu. Bunun içerisinde kernelin yaptığı ELF parsing, dinamik kütüphaneleri bulma gibi şeyler de var ama bu 3. sınıf işletim sistemleri konusu. Şimdilik bu kadarının büyük resmi görmek açısından yeterli olduğunu düşünüyorum.