Linux ve diğer birçok işletim sisteminde komutların çalıştırılabilmesi için, onları yazacak bir konsol olması gerekir. İşte linux’da o konsola shell yani kabuk denir. Windows’da cmd veya PowerShell, MacOS’da ise terminal bulunmaktadır. Shell’e bir komut yazıp Enter’a bastığımızda shell istediğimiz programı veya programları bizim için daha evvelden tanımlı olduğu yerde bulur ve çalıştırır. Shell’i başlatmak için, kullandığınız dağıtımın menülerinde Terminal, xterm, gnome-terminal, konsol, uxterm‘e benzer bir kısayol bulmalısınız. Mesela Ubuntu 11.04 üzerinde shell’i çalıştırmak için Ctrl+Alt+T kombinasyonunu kullanabilir veya Alt+F2 ile açılan çalıştır penceresine gnome-terminal yazıp shell’i başlatabilirsiniz. Shell başladıktan sonra kullanıcı adınız ve sonunda $ işareti ile sizden komut beklemektedir. Benim sistemimde shell çıktısı şöyle;
developer@workstation:~$
Şimdi sistemde kimlerin oturum açtığını gösteren who komutu ile devam edelim. Shell ekranı üzerinde who yazıp Enter’a bastığımda aldğımız cevap şu şekilde
who
developer :1 2024-02-25 14:31 (:1)
shell gerekli olan who programını çalıştırdı ve programın ürettiği cevabı ekrana basarak görevini tamamladı. Aslında shell’in kendiside bir programdır ve linux sistemler üzerinden birden fazla shell bulunabilir. Ancak bizim en sık kullanacağımız shell BASH (Bourne Again Shell) olacaktır. Shell’i kapatmak için exit komutu kullanılabilir. Böylece shell oturumu güvenli bir şekilde sonlandırılmış olur.
Shell üzerinden bir komut girdiğimizde, bu komut ya disk üzerindeki bir programı ya da shell’in dahili komutlarından birini çağıracaktır. Yani shell’e yazdığımız komut disk üzerindeki bir program çağrısı değilde shell’in dahili bir komutu olabilir. Mesela who komutunun bir programmı yoksa shell’in dahili bir komutu olduğuna bakalım.
type who
who is hashed (/usr/bin/who)
Gördüğünüz gibi who komutu aslında disk üzerinde /usr/bin/who programını çalıştırmaya yarıyor.
Birde cd (Change Directory) komutuna bakalım
type cd
cd is a shell builtin
cd komutu shell’in dahili komutlarından biri olduğundan direk olarak çalıştırılacaktır.
Peki shell’e yazdığımız komut dahili bir komut değilse disk üzerinden nerede aranıp çalıştırılacak? Bunun için, shell’in daha evvelden girilen komutun path’ini bilmesi gerekir. Yoksa çalıştırılacak olan programın nerede olduğunu bilemeyeceğinden hata verecektir. Varsayılan olarak Linux dağıtımlarında en çok kullanılan komutlar, /usr/bin ve /bin altında yer alırlar. Shell dahilinde yer alan PATH isimli bir değişken, komutların yer aldığı dizinlerin adresini içerir.
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Görüldüğü gibi shell’e bir komut girildiğinde ve bu komut shell’in dahili bir komutu değilse yukarıdaki dizinlerde arama yapılarak istenilen komut çalıştırılacaktır. Eğer girilen komut bu dizinlerde bulunamadıysa
unknowncommand
unknowncommand: command not found
hatasını verecektir. Eğer geçici olarak shell’e komutların aranacağı yeni bir dizin bildirmek istersek PATH değişkenini değiştirmemiz gerekir. Bunun için aşağıdaki komutu çalıştırabiliriz.
PATH=$PATH:/home/developer/Desktop
Burada /home/developer/Desktop dizinini shell’e bildirdiğimden, konsola bir komut girildiğinde bu komut /home/developer/Desktop dizininde de aranacak ve bulunursa çalıştırılacaktır. Ancak burada çok önemli bir nokta var. Eğer mevcut shell penceresini kapatırsanız PATH değişkeninde yaptığınız değişiklikler kaybolacaktır. Yani sizin PATH değişkeninde yaptığınız değişiklikler bir oturum müddetince geçerli olacaktır. Değişikliğin kalıcı olarak yapılmasını isterseniz ~./bash_profile dosyasında birkaç değişiklik yapmanız gerekecektir.