96 lines
4.9 KiB
HTML
96 lines
4.9 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="de">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title></title>
|
||
<link href="/css/style.css" rel="stylesheet">
|
||
</head>
|
||
<body>
|
||
<header>
|
||
<h1>Minishell - Die Shell</h1>
|
||
<nav>
|
||
<a href="/de">Start</a>
|
||
<a href="mailto:victor@victorvobis.org">Email</a>
|
||
<a href="https://git.victorvobis.org/victorvobis" target="_blank">Git</a>
|
||
<a href="https://git.victorvobis.org/victorvobis/minishell" target="_blank">Quellcode</a>
|
||
<a href="/en">English</a>
|
||
</nav>
|
||
</header>
|
||
<main>
|
||
<section class="content">
|
||
<h2>Die Shell</h2>
|
||
<p style="font-weight: bold;">
|
||
Bash-ähnliche Shell. Von Grund auf. In C. <a href="#demo">Demo unten</a>
|
||
</p>
|
||
<div class="space-y-2">
|
||
<p>
|
||
Das Minishell-Projekt ist Teil des Common-Core-Curriculums bei
|
||
<a class="underline text-blue-700 hover:text-blue-900" href="https://42vienna.com">42Vienna</a> und
|
||
gilt als Meilenstein und einer der größten Sprünge in der Komplexität auf dem Weg zur Fertigstellung des Cursus.
|
||
</p>
|
||
<p>
|
||
Die Regeln sind einfach: Erstelle ein Programm, das grundlegendes Shell-Verhalten repliziert, wie es typischerweise auf POSIX-Systemen zu finden ist.
|
||
</p>
|
||
<p>
|
||
Einige der Anforderungen sind:
|
||
</p>
|
||
<ul>
|
||
<li>Eigene <a href="https://github.com/gnu-mirror-unofficial/readline">readline</a>-Funktion</li>
|
||
<li>Kommandozeilen-Parsing</li>
|
||
<li>I/O-Schleife zur Annahme kontinuierlicher Befehle</li>
|
||
<li>Befehlsausführung</li>
|
||
<li>Dateideskriptor-Umleitung</li>
|
||
<li>Pipe-Operatoren</li>
|
||
<li>Umgebungsvariablen</li>
|
||
<li>Eingebaute Funktionen (cd, export, exit usw.)</li>
|
||
<li>Heredoc</li>
|
||
<li>Logisches UND ( && )</li>
|
||
<li>Logisches ODER ( || )</li>
|
||
<li>und mehr...</li>
|
||
</ul>
|
||
<p>
|
||
Das Programm muss in C geschrieben werden, wir arbeiten auf GNU/Linux-Maschinen.
|
||
</p>
|
||
<p>
|
||
Wir müssen außerdem einer sehr strengen Norm folgen, über die du
|
||
<a href="/assets/42-norm.pdf">hier</a> mehr lesen kannst.
|
||
</p>
|
||
<p>
|
||
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.
|
||
</p>
|
||
<p>
|
||
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.
|
||
</p>
|
||
<p>
|
||
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!
|
||
</p>
|
||
<p>
|
||
Dieses Projekt war eine Teamarbeit, und großer Dank gilt meinem Teampartner und guten Freund,<br/>
|
||
<a href="https://github.com/zekmaro">Andrej Arama</a>!
|
||
</p>
|
||
|
||
<p>
|
||
Der Quellcode des Projekts ist auf meinem
|
||
<a href="https://git.victorvobis.org/victorvobis/minishell">Git-Server</a> zu finden und
|
||
ich habe auch eine Live-Version der Shell unten bereitgestellt.<br/>
|
||
</p>
|
||
<p>
|
||
Dank und vielen Dank an
|
||
<a href="https://github.com/tsl0922/ttyd">ttyd</a>
|
||
für die Web-Integration!<br/>
|
||
Viel Spaß!
|
||
</p>
|
||
<h2 id="demo">Demo</h2>
|
||
<div id="shell-container" style="height: 400px;">
|
||
<iframe sandbox="allow-same-origin allow-scripts" src="/proxy/minishell/" style="width: 100%; height: 100%; border: none; display: block;"></iframe>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</main>
|
||
</body>
|
||
</html>
|