Die Shell
Bash-ähnliche Shell. Von Grund auf. In C. Demo unten
Das Minishell-Projekt ist Teil des Common-Core-Curriculums bei 42Vienna und gilt als Meilenstein und einer der größten Sprünge in der Komplexität auf dem Weg zur Fertigstellung des Cursus.
Die Regeln sind einfach: Erstelle ein Programm, das grundlegendes Shell-Verhalten repliziert, wie es typischerweise auf POSIX-Systemen zu finden ist.
Einige der Anforderungen sind:
- Eigene readline-Funktion
- Kommandozeilen-Parsing
- I/O-Schleife zur Annahme kontinuierlicher Befehle
- Befehlsausführung
- Dateideskriptor-Umleitung
- Pipe-Operatoren
- Umgebungsvariablen
- Eingebaute Funktionen (cd, export, exit usw.)
- Heredoc
- Logisches UND ( && )
- Logisches ODER ( || )
- und mehr...
Das Programm muss in C geschrieben werden, wir arbeiten auf GNU/Linux-Maschinen.
Wir müssen außerdem einer sehr strengen Norm folgen, über die du hier mehr lesen kannst.
Was die 42-Projekte meiner Meinung nach auszeichnet, ist, dass die verwendeten Werkzeuge sehr eingeschränkt sind – im Wesentlichen sind nur Syscalls zur Kommunikation mit dem Kernel, einige Hilfsfunktionen und Speicherfunktionen erlaubt, und in diesem Fall war die Verwendung von printf erlaubt, was normalerweise verboten ist. Das bedeutet, dass alle Hilfsfunktionen von Hand implementiert werden müssen und der gesamte relevante Code von den Projektautoren geschrieben wird.
Wir durften die in Bash verwendete readline-Funktion zur Verarbeitung von Benutzereingaben verwenden. Da Speicherlecks jeglicher Art beim Validieren eines Projekts als nicht behebbarer Fehler gelten und die readline-Funktion unweigerlich Speicher lecken würde, wurden diese Leaks von den Projektanforderungen ausdrücklich toleriert.
Aber aus Neugier habe ich beschlossen, die readline-Funktion nachzubauen, die Abhängigkeit und die Leaks aus unserem Projekt zu entfernen und dabei viel zu lernen. Meiner Meinung nach ist dies einer der interessanteren Teile unserer Implementierung, und ich habe es sehr genossen!
Dieses Projekt war eine Teamarbeit, und großer Dank gilt meinem Teampartner und guten Freund,
Andrej Arama!
Der Quellcode des Projekts ist auf meinem
Git-Server zu finden und
ich habe auch eine Live-Version der Shell unten bereitgestellt.
Dank und vielen Dank an
ttyd
für die Web-Integration!
Viel Spaß!