Das Terminal ist mein wichtigstes Werkzeug auf dem Desktop. Allein schon weil ich keinen meiner RasPis an einem Bildschirm angeschlossen habe. Lange war die bash die Standard Shell. Ich habe mich zwar ab und an gefragt, ob es wohl modernere Shells gibt und was sie wirklich bringen. Aber da der Rest der Welt alles in bash skriptet und für alle möglichen Konfigurationen benutzt, war mir das Risiko zu groß, dass eine neue Shell nur Ärger bringt. Das war nicht ganz richtig, wie sich herausstellen sollte.

Oma bash

Mit dem Mac und der standardmäßig vorinstallierten zsh kam mir die Erkenntnis, dass die Umstellung auf eine neue Shell ein eher kleines Problem ist. Mit einem Shebang (zB #!/bin/bash) in der ersten Zeile des Scripts kann man ja die Shell unabhängig vom der eigenen Standard Shell einstellen. Die eigene Login Shell kann dann unabhängig davon zB die zsh sein und alles funktioniert wie immer. Mit der Erweiterung Oh-my-zsh gingen mir dann die Augen auf, wie sehr die bash schon in die Jahre gekommen ist. Farbe, Plugins, smarte Deko-Leisten und UniCode Symbole für die zsh zeigten, wie viel Spaß eine Konsole machen kann. In einem kleinen Nebensatz auf einer Webseite zu Oh-my-zsh tauchte ein Hinweis auf die fish Shell auf, und dass man einiges von dort in Oh-my-zsh übernommen hat. Nach ein paar Monaten mit der zsh und Oh-my-zsh bin ich dann zur fish Shell gewechselt. Also:

Was ist die fish Shell?

Die fish Shell ist eine Shell für die Kommandozeile und legt den Fokus eindeutig auf Benutzerfreundlichkeit und eine smarte Unterstützung bei der Arbeit auf der Konsole. Sie ist für die wichtigsten Desktop-Betriebssysteme verfügbar. Auf dem RasPi ist sie in wenigen Augenblicken installiert:

sudo apt update && sudo apt install fish

Zum Ausprobieren startet man sie mit dem Aufruf von fish und wird freundlich begrüßt:

Nett begrüßt in den Tag

Die Begrüßung kann man in der Datei ~/.config/fish/config.fish anpassen, indem man die Funktion „fish_greeting“ ans Ende der Datei hinzufügt:

function fish_greeting
	echo Hello (set_color brgreen; whoami; set_color normal)!
	echo The time is (set_color yellow; date +%T; set_color normal)and this machine is called (set_color brblue)$hostname(set_color normal)
	fortune -a | cowsay | lolcat
end

Im Script werden 3 kleine Programme für Textausgabe verwendet: fortune (eine Art digitaler Glückskeks), cowsay (eine Kuh in ASCII Grafik, die Text in einer Sprechblase darstellt) und lolcat (färbt die Ausgabe in Regenbogenfarben). Die Begrüßung nach dem Starten der fish Shell sieht dann so aus:

Den Prompt konfigurieren

Solche Spielereien sind nett und zeigen, wie die Shell grundsätzlich funktioniert. Es gibt zahlreiche vordefinierte Shell Funktionen neben der Begrüßung ist die Gestaltung des Shell-Prompts vielleicht wichtiger. In der Standardeinstellung zeigt er den User, den Hostname und das aktuelle Verzeichnis an.

Befindet man sich in einem git Verzeichnis, wird zusätzlich am Ende in Klammern der aktuell ausgecheckte Branch angezeigt. Bevor man eigene Prompts definiert, lohnt ein Blick auf die Liste von vordefinierten Prompts mit fish_config prompt show. Beim terlar Prompt wird auch noch angezeigt, ob der git branch aktuell ist. Zusätzlich färbt sich der Pfeil vor dem Curser rot, wenn das letzte Programm mit einem Fehlercode endete. So cool.

Den Alltag erleichtern

Die fish shell enthält viele kleine Funktionen, die einfach nur hilfreich sind: Beginnt man zu tippen, macht die Shell Vorschläge und färbt die Eingabe so lange rot, bis es einen ausführbaren Befehl ergibt. Sie kennt auch die Optionen zu den Programmen und kann sinnvolle Vervollständigungen aus der Historie anbieten. Die letzten Befehle kann man wie gewohnt mit CTRL+R aus der Historie holen. Die fish Shell zeigt sie allerdings tabellarisch an und man kann bequem mit den Pfeiltasten den gewünschten Befehl auswählen.

Plugins managen

Mit fisher steht ein Plugin Manager zur Verfügung. Die Installation von erfolgt mit dem folgenden Aufruf:

curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher

Um die Installation und Konfiguration von Ruby und Node.js zu vereinfachen, habe ich mir zum Beispiel die Plugins fish-rbenv und nvm.fish installiert.

Scripting mit der fish

Scripting mit der fish Shell kommt mir etwas intuitiver vor als mit der prähistorischen bash. Ein Blick auf die Dokumentation und dort in den Abschnitt The fish language findet man einen ersten Einstieg. Eine von mir häufig genutzte Funktion ist zum Beispiel das Zusammenfügen einer Liste mit einem Dateinamen. Mit der Brace expansion geht das recht schnell:

Ähnlich einfach ist es mit dem zeilenweise verarbeiten einer Datei. Klar sind die Werkzeuge sed und awk mächtiger und besser als die bash. Da muss ich das Trennzeichen explizit setzen und wieder zurück stellen, damit in einer for-Schleife die Datei nicht nach Leerzeichen sondern Zeilenende aufgeteilt wird. In der fish shell ist es einfach:

for line in (cat file)
    echo Mach irgendwas mit der Zeile: $line
end

Fazit

Ich habe nur einen winzigen Bruchteil der fish Shell gezeigt. Das Projekt ist sehr aktiv und die Anpassungsmöglichkeiten sind groß. Für jemanden der viel auf der Konsole unterwegs ist, kann man die fish Shell unbedingt zum Ausprobieren empfehlen.