Bu dosya, projedeki mini shell'in nasil kullanildigini ve kodun hangi asamalardan gectigini anlatir. Icerik kodun mevcut davranisina gore hazirlanmistir.
make./minihellminihell su akisi izler:
- Prompt olusturulur.
readlineile satir okunur.- Parser satiri token'lara ayirir.
- Expansion (
$VAR,$?) uygulanir. - Komutlar pipe bolumlerine ayrilir.
- Builtin ise parent'ta (tek komutsa), degilse pipeline/external akisinda calistirilir.
- Redirection ve pipe fd'leri uygulanir.
- Cikis kodu
g_status_codeicinde tutulur.
Prompt formati kabaca:
USER@program:aktif_dizin$
USERenv'den cekilir.- Dizin
HOMEaltindaysa~ile kisaltilir. Ctrl+Cyeni satira gecirir ve prompt'u yeniler.Ctrl+D(EOF) shell'den cikar.
Parser su tipleri uretir:
p: pipe (|)o: redirection operatorleri (<,>,<<,>>)w: normal wordq: tek tirnak icindeki word ('...')Q: cift tirnak icindeki word ("...")
Asagidaki durumlar syntax error verir:
- Satir pipe ile baslar veya biter
- Ardisik pipe (
||gibi parser seviyesinde iki pipe token) - Redirection operatorunden sonra word gelmemesi
- Kapanmamis tirnak
Expansion w ve Q token'larinda calisir, q (tek tirnak) icinde calismaz.
Desteklenenler:
$VAR$?(son cikis kodu)
Ayrica parser sonrasinda bitisik token birlestirme vardir. Ornek:
"abc"$USER'def'
tek argumana donusturulur.
cd,echo,env,pwd,unset,export- Tek komutsa parent process icinde calisir.
- Bu sayede
cd,export,unsetortam degisiklikleri kalici olur.
- Pipeline tarafinda
fork + pipe + dup2akisi vardir. - Son komutun cikis status'u
g_status_codeolur. - External komutlar
PATHuzerinden bulunur veexecveile calisir.
Desteklenen redirection:
< file> file>> file<< limiter(heredoc)
Notlar:
- Ayni komutta birden fazla redirection varsa son gecerli olan etkili olur.
- Acilis hatalari (
No such file,Permission denied) stderr'e yazilir. - Pipeline'da gereksiz fd'ler kapatilir.
Kullanim:
echo [flags] [arg ...]Desteklenen flag:
-n(newline basmaz)-nnngibi tekrarlar da kabul edilir (hepsi-nsayilir)
Ornek:
echo hello
echo -n helloKullanim:
cd [path]
cd -
cd ~
cd ~/alt_dizinDavranis:
- Arguman yoksa
HOME cd -iseOLDPWD- Basarili oldugunda
PWD/OLDPWDguncellenir cdfazla argumanda hata verir
Kullanim:
pwdAktif dizini yazar.
Kullanim:
envSadece KEY=VALUE formatindaki env satirlarini yazar.
Kullanim:
export
export KEY=VALUE
export KEYDavranis:
- Argumansiz: tum env'i
declare -x ...formatinda yazar KEY=VALUE: set/updateKEY: bos degerle ekleyebilir- Gecersiz isimde hata verir
Kullanim:
unset KEY [KEY ...]Verilen key'leri env listesinden siler.
Kullanim:
exit
exit N
exit numeric_arg extra_argDavranis:
exit: mevcutg_status_codeile cikarexit N:Nunsigned char'a normalize edilerek cikar- Sayisal olmayan arguman: mesaj basar, kod
2ile cikar - Cok arguman: mesaj basar, shell acik kalir, status
1
- Basarili komutlar genelde
0 Ctrl+C->130Ctrl+\->131- Syntax error ->
2
Bu implementation su an su davranislara odakli:
- Komut, pipe, redirection, heredoc, expansion
- Temel builtin seti
Asagidaki kabuk ozellikleri tam bash kapsami degildir:
&&,||,()gibi kontrol operatorleri- Gelismis wildcard/glob davranislari
- Alt-shell ve ileri seviye bash ozellikleri
printf 'echo hi\nexit\n' | valgrind \
--leak-check=full \
--show-leak-kinds=all \
--suppressions=valgrind_readline.supp \
./minihellPipe/fork testlerinde child process raporlari cok olabilir. Ana akisi temiz gormek icin:
valgrind --trace-children=no ...Bu durumda parent shell'in bellek ozetini daha temiz gorursun.