Eine Unix-Shell in C++ — gebaut um zu verstehen, was wirklich passiert wenn man Enter drückt.
- Powerline-Style — zeigt Verzeichnis, Git Branch, Git Status (
✓/✗) und Uhrzeit - Vollständig konfigurierbar — alle Farben über
~/.myshrcanpassbar - Startup Animation — Logo beim Start (instant, typewriter oder fade-in)
- Farbiges
ls— Dateien nach Typ eingefärbt (C++, JS/TS, HTML, CSS, JSON, Java, Python, ...) echo— mit Variablen-Support ($HOME,$PATH, ...)export— Umgebungsvariablen setzenalias— Abkürzungen definieren, werden in~/.myshrcgespeicherthistory— alle Befehle der Session anzeigenconfig— öffnet~/.myshrcdirekt in nvimsf [filter]— Datei fuzzy suchen und in$EDITORöffnensd [filter]— Ordner fuzzy suchen und direkt navigieren
- Pipes
|, Sequenz;, bedingte Ausführung&&/|| - I/O Umleitung
>,>>,< - Tilde-Expansion, Command History, Tab Autocomplete
- Quoted Arguments, Ctrl+C
$VARwird jetzt in allen Pfaden expandiert: normale Kommandos, Pipes|, Redirects> >> <, Sequenzen;, Bedingungen&& ||, Aliases.- Tilde-Expansion (
~) läuft ebenfalls überall nach dem Parsen. - Die Expansion arbeitet pro Argument mit statischem Puffer, sodass keine ungültigen Zeiger entstehen.
Gemessen mit hyperfine:
| Command | Mean [ms] |
|---|---|
| Startup | 9.5 ± 0.4 |
| ls | 16.5 ± 1.2 |
| pwd | 18.1 ± 0.6 |
| echo | 16.8 ± 1.1 |
Schneller als fish (~14ms Startup) · 0 Memory Leaks
- C++17 oder neuer
- readline ≥ 8.0
- make
- fzf (für
sfundsd)
macOS
brew install readline fzf
git clone https://github.com/Mirac61/mysh
cd mysh && make && ./shellLinux (Debian/Ubuntu)
sudo apt install libreadline-dev fzf
git clone https://github.com/Mirac61/mysh
cd mysh && make && ./shellcp example.myshrc ~/.myshrcAlle Optionen
| Option | Werte | Beschreibung |
|---|---|---|
prompt_folder |
0–255 | Farbe des Ordnernamens |
prompt_time |
0–255 | Farbe der Uhrzeit |
prompt_git_clean |
0–255 | Farbe bei sauberem Repo |
prompt_git_dirty |
0–255 | Farbe bei uncommitted Änderungen |
startup |
0–3 | 0 = kein Logo, 1 = sofort, 2 = typewriter, 3 = fade-in |
alias |
name="befehl" |
Eigene Shortcuts |
Alle 256 Farben anzeigen:
for i in {0..255}; do echo -e "\033[48;5;${i}m $i \033[0m"; done./test.shBenutzung
# Navigation
cd ~/Projekte
ls -la
# Fuzzy Search
sf main # Datei suchen → in $EDITOR öffnen
sd Proj # Ordner suchen → direkt navigieren
# Pipes und Umleitung
ls | grep .cpp
ls > output.txt
# Bedingte Ausführung
make && ./shell
cd /nicht/vorhanden || echo "Verzeichnis nicht gefunden"
# Aliases und Variablen
alias ll="ls -la"
export NAME=Mirac
echo $NAMEProjektstruktur
mysh/
├── main.cpp # Hauptschleife und Befehlsausführung
├── builtins.cpp # Built-in Befehle (cd, export, alias, sf, sd, ...)
├── shell.h # Deklarationen und Farb-Definitionen
├── ls.cpp # eigenes ls mit Dateityp-Färbung
├── parse.cpp # Input-Parsing, Pipes, Redirect, Quote-Handling
├── execute.cpp # Prozessausführung, Pipes, I/O Umleitung
├── config.cpp # ~/.myshrc laden und speichern
├── git.cpp # Git-Erkennung für Prompt
├── startup.cpp # Startup-Animation
├── test.sh # automatisierte Tests
├── example.myshrc # Beispiel-Konfiguration
└── Makefile
Warum?
Die meisten Tutorials erklären die Theorie. Ich wollte eine Shell bauen und dabei wirklich verstehen, was zwischen Enter-drücken und Output-sehen passiert —
fork(), execvp(), dup2(), pipe(), alles davon.
Die Animationen wurden mit Unterstützung von Claude (Anthropic) entwickelt.
