Es fängt natürlich mit der Frage an: welche Shell?
Das ist sehr einfach zu beantworten. Auf MacOS ist die zsh die Standard-Shell - und daher sollte man die auch benutzen. Artikel Fertig, vielen Dank fürs Lesen! 😅
Windows hat die PowerShell - wer damit Arbeiten (muss) sollte sie lernen!
Die nackte Shell ist ziemlich schlecht konfiguriert, da die Möglichkeiten der Shell gar nicht ausgenutzt werden. Auf Linux-Distributionen ist es Standard, dass die Shell von der Distribution eingerichtet wird, daher kann man damit meistens schon gut arbeiten.
Aber für MacOS (und Windows) gibt es viel zu tun.
So sieht die zsh unkonfiguriert aus:
dwt@NB1321 ~ % cd Library/Favorites dwt@NB1321 Favorites %
Das ist schon gar nicht schlecht, denn man sieht einiges:
dwt
: Welcher Nutzer man gerade ist. Wichtig, wenn man viel mitsudo
arbeitet, damit man nicht versehentlich Kommandos alsroot
mit zu vielen Rechten ausführt.NB1321
: Auf welchem Rechner man gerade eingeloggt ist. Wichtig wenn man auf vielen Rechnern arbeitet und nicht- Den aktuellen Ordner in dem man ist (
Favorites
). Wichtig damit man z.B. nicht versehentlich die falschen Dateien löscht. - Der Prompt
%
trennt die Meta-Informationen von dem was man selbst eingibt.
Da geht aber noch wesentlich mehr. Bei mir z.B. sieht der Prompt so aus:
~/C/P/m/api ❄️ 🧪 nix-shell-env 🐍 venv ⛵️ mkk-itsc-dev (api) 🌱 main $! 4s ❯
Da ist enthalten:
~/C/P/m/api
- nicht nur der aktuelle Ordner, sondern auch jeweils der Anfangsbuchstabe der darüber liegenden Ordner. Das liefert platzsparend viel mehr Kontext, wo man gerade ist. Super wenn man in vielen Projekten gleichnamige Ordner wie z.B.etc
,src
oderdist
hat.❄️ 🧪 nix-shell-env
Zeigt an, dass gerade eine 'dreckige' Nix-Shell aktiv ist. Das verwende ich um Projek-spezifische Abhängigkeiten (Shell-Tools, bestimmte Vesionen von Python etc.) zu installieren die ich deklarativ im Projekt tracke. Gut vergleichbar mit Python-Virtual-Envs - aber eben für alles, nicht nur Python-Pakete. Dreckig ('impure') ist Sie, da nicht nur die Shell-Tools aus der Nix-Shell sichtbar sind, sondern auch alles andere was ich im Betriebsystem installiert habe.🐍 venv
- zeigt an, dass gerade ein Python-Virtual-Env aktiv ist. Da ich hauptsächlich mit Pyton entwickle ist das natürlich entscheidend weil es bedeutet das ich die Projekt-Werkzeuge direkt verwenden kann, da sie im$PATH
und$PYTHONPATH
sind.⛵️ mkk-itsc-dev (api)
zeigt an, dass ich mit demmkk-itsc-dev
Kubernetes Cluster verbunden bin, und den Namespaceapi
aktiviert habe. Das ist mir sehr wichtig, damit ich nicht versehentlich mitkubectl
Befehlen versehentlich den Produktiv-Cluster zerstöre. (Rate wieso mir das so wichtig ist…)🌱 main $!
zeigt an, dass ich in einem Git-Repository bin, auf dem main branch, das ich dinge ge-'stash't habe (die vergisst man sonst sehr leicht) und das ich Änderungen habe die ich noch nicht commited habe. Hier gibt es auch noch mehr informationen wenn das Repo den entsprechenden Zustand hat.- Zuletzt sehe ich da das letzte Kommando 4 Sekunden gedauert hat. Das wird nur angezeigt wenn das letzte Programm mehr als 3 Sekunden gedauert hat und ist immer wiede ein hilfreiche Information um bei langlaufenden Prozesen zu verstehen ob es sich lohnt da etwas zu optimieren.
Natürlich könnte man hier noch viel mehr anzeigen, je nachdem an was man gerade arbeitet. Ich habe hier eben die Informationen aufgenommen die ich am meisten benötige.
Jetzt kommt der Clou: Früher habe ich das alles von hand Konfiguriert. Das war ein ewiges und mühsammes gefummel um $PS1
und konsorten so hinzufummeln das das alles funktioniert hat, und hat nie Spaß gemacht. Der Standard ist derzeit, das man einen Shell-Konfigurations-Framework wie Oh-My-Zsh oder Prezto verwendet. Und die sind auch gut. Aber auch langsam, und komplex und kompliziert. Wenn man da mal etwas anders haben will dann gott bewahre wenn das nicht schon vorbereitet ist oder man darf sich nicht nur mit den Komplexitäten von $PS1
auseinandersetzen, sondern auch noch damit wie genau dieser Framework das handhabt.
Inzwischen bin ich weiser geworden, und verwende Starship. Damit kann ich meinen Prompt deklarativ in einer .toml
-Datei konfigurieren und diesen auch mitnehmen wenn ich mal die Shell wechsle. (Was häufiger vorkommt als mir lieb ist). Und: Starship funktioniert auch mit der PowerShell.
So sieht meine Konfiguration aus
Wie richtet man das ein?
brew install starship
(oder mit nix)nano ~/.zshrc
und am Endeeval "$(starship init zsh)"
einfügen.- Konfigurationsdatei erstellen:
nano ~/.config/starship.toml
und z.b. den Inhalt aus der Datei oben einfügen. - Shell neu starten oder neues Terminal öffnen.
Danke sagen für die grandiose Verbesserung eures Shell-Lebens bei mir nicht vergessen. 😅