Kendi UNIX Kabuğumuz
Bu proje, 42 Okulu müfredatı kapsamında, bash gibi popüler kabukların temel işlevlerini taklit eden kendi UNIX kabuğumuzu sıfırdan oluşturmayı amaçlamaktadır. Proje, proses yönetimi, dosya tanımlayıcıları (file descriptors), sinyal işleme ve komut satırı yorumlama gibi temel C ve UNIX konseptlerini derinlemesine anlamamızı sağlamıştır.
Minishell, bir komut satırı yorumlayıcısıdır. Kullanıcıdan aldığı komutları analiz eder, çalıştırır ve sonucunu ekrana basar. Bu süreç, modern işletim sistemlerinin temel taşlarından birini anlamak için harika bir fırsattır.
Minishell'imiz aşağıdaki temel kabuk (shell) özelliklerini desteklemektedir:
- Komut İstemi (Prompt): Her komut girişinden önce interaktif bir istem gösterir.
- Komut Geçmişi:
readlinekütüphanesi sayesinde yukarı/aşağı ok tuşlarıyla komut geçmişinde gezinebilir. - Komut Yürütme:
PATHortam değişkeninde bulunan veya mutlak/göreli yolla belirtilen tüm sistem komutlarını çalıştırır. - Ayrıştırma (Parsing):
- Komutları, opsiyonları ve argümanları doğru bir şekilde ayırır.
- Tek tırnak (
') ve çift tırnak (") içindeki ifadeleri bir bütün olarak ele alır. Çift tırnak içinde ortam değişkenlerini ($VAR) genişletir.
- Ortam Değişkenleri:
$VARveya${VAR}formatındaki ortam değişkenlerini komut yürütülmeden önce çözümler.$?ile son komutun çıkış koduna erişim sağlar. - Yönlendirmeler (Redirections):
<: Dosyadan girdi alır (input).>: Çıktıyı dosyaya yazar (output), dosya yoksa oluşturur, varsa içeriğini siler.>>: Çıktıyı dosyanın sonuna ekler (append).<<: "Here Document" (heredoc) ile geçici girdi oluşturur.
- Pipes (
|): Bir komutun çıktısını diğer bir komutun girdisine bağlar. Çoklu pipe zincirleri desteklenmektedir. - Sinyal Yönetimi:
Ctrl-C: Çalışan bir prosesi sonlandırır, komut satırı boşken yeni bir satır oluşturur.Ctrl-D: Komut satırı boşken kabuğu sonlandırır (EOF).Ctrl-\: Çalışan bir prosesiSIGQUITsinyali ile sonlandırır.
Aşağıdaki komutlar, yeni bir proses oluşturulmadan doğrudan Minishell içinde çalıştırılır:
echo: Argümanları ekrana basar.-nseçeneği ile yeni satır eklemez.cd: Çalışma dizinini değiştirir.pwd: Mevcut çalışma dizinini gösterir.export: Yeni ortam değişkeni oluşturur veya mevcut olanı günceller.unset: Bir ortam değişkenini siler.env: Tüm ortam değişkenlerini listeler.exit: Minishell'den çıkış yapar.
Projeyi klonladıktan sonra derlemek ve çalıştırmak için aşağıdaki adımları izleyin:
# 1. Proje reposunu klonlayın
git clone git@github.com:saidyanak/minishell.git
# 2. Proje dizinine gidin
cd minishell
# 3. Projeyi derleyin
make
# 4. Minishell'i başlatın
./minishellBasit Komut:
minishell> ls -l | grep ".c"Yönlendirmeler:
minishell> cat Makefile > output.txt
minishell> grep "main" < main.c
minishell> echo "yeni satir" >> output.txtHere Document (<<):
minishell> cat << END
> Bu bir here document testidir.
> Birden fazla satır yazılabilir.
> ENDOrtam Değişkenleri ve Tırnaklar:
minishell> export MESAJ="Merhaba Dunya"
minishell> echo "Mesajim: $MESAJ"
Mesajim: Merhaba Dunya
minishell> echo 'Mesajim: $MESAJ'
Mesajim: $MESAJ- Proses Yönetimi:
fork(),execve(),waitpid() - Dosya Tanımlayıcıları:
open(),close(),read(),write(),dup(),dup2() - Pipe Yönetimi:
pipe()ile prosesler arası iletişim. - Sinyal İşleme:
signal(),sigaction(),kill() - Bellek Yönetimi:
malloc(),free()ve bellek sızıntılarının önlenmesi. - Ayrıştırma (Parsing): Komut satırını mantıksal birimlere (token) ayırma ve bu birimleri yorumlayarak bir yürütme ağacı (execution tree) oluşturma.
- Hata Yönetimi: Sistem çağrılarından dönen hataları doğru bir şekilde ele alma.
Bu proje aşağıdaki kişiler tarafından geliştirilmiştir:
- [Said Yanak] - (@saidyanak)
- [Yusuf Alperen Ocak] - (@alperenocak)
Bu proje, 42 Network'ün eğitim müfredatının bir parçasıdır.