website/site/de/minishell.html
2026-02-24 10:49:33 +01:00

97 lines
5.0 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<link rel="preload" href="/css/style.css" as="style">
<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>