fish — die benutzerfreundliche Shell mit Autosuggestions

Praxis-Guide zu fish: Variablen, Funktionen, Abbreviations und Universal Variables in der benutzerfreundlichen, nicht-POSIX-kompatiblen Shell.

fish – die Friendly Interactive Shell – setzt auf Komfort statt Konvention: Autosuggestions, Syntax-Highlighting und intelligente Tab-Vervollständigung funktionieren sofort, ganz ohne Konfiguration. Der zentrale Stolperstein ist die eigene, nicht-POSIX-kompatible Syntax – statt export nutzt du set -x, statt &&/|| schreibst du and/or. Dieser Guide zeigt dir Variablen, Funktionen, Abbreviations und die String-Tools, die du im Alltag wirklich brauchst.

Grundlagen

fish — Eine Fish-Shell-Sitzung starten.

fish

fish -c '<command>' — Einen Kommando-String ausführen und beenden.

fish -c 'echo Hello World'

fish -l — Als Login-Shell starten.

fish -l

fish -n <script> — Syntax prüfen, ohne auszuführen (No-Execute-Modus).

fish -n myscript.fish

fish_config — Die webbasierte Konfigurationsoberfläche im Browser öffnen.

fish_config

fish_config theme choose <name> — Ein Farbschema von der Kommandozeile aus setzen.

fish_config theme choose 'Dracula'

fish --version — Die installierte Fish-Version anzeigen.

fish --version

Variablen & Umgebung

set <var> <value> — Eine lokale Variable setzen (nur im aktuellen Scope).

set name 'World'

set -x <var> <value> — Eine Variable setzen und exportieren (für Kindprozesse verfügbar).

set -x EDITOR vim

set -U <var> <value> — Eine Universal Variable setzen (bleibt über Sitzungen und Neustarts erhalten).

set -U fish_greeting 'Welcome back!'

set -e <var> — Eine Variable löschen (unset).

set -e TEMP_VAR

set -S <var> — Ausführliche Infos zu einer Variable anzeigen (Scope, Export-Status).

set -S PATH

set -l <var> <value> — Eine lokale Variable setzen (nur im aktuellen Block).

set -l tmp_file /tmp/output.txt

fish_add_path <dir> — Ein Verzeichnis dauerhaft zum PATH hinzufügen (universal).

fish_add_path ~/.local/bin

Abbreviations & Aliase

abbr -a <name> <expansion> — Eine Abbreviation anlegen (expandiert beim Tippen inline).

abbr -a gco 'git checkout'

abbr -a --position command <name> <expansion> — Abbreviation anlegen, die nur in Kommando-Position greift.

abbr -a --position command l 'ls -la'

abbr -e <name> — Eine Abbreviation löschen.

abbr -e gco

abbr -l — Alle Abbreviation-Namen auflisten.

abbr -l

abbr --show — Alle Abbreviations samt ihrer Expansionen anzeigen.

abbr --show

alias <name> '<command>' — Einen Funktions-Alias anlegen (Wrapper um eine Funktion).

alias ll 'ls -la'

funcsave <name> — Eine Funktion/einen Alias dauerhaft auf die Platte speichern.

funcsave ll

Funktionen

function <name>; ...; end — Eine Funktion definieren.

function greet; echo "Hello, $argv[1]"; end

function <name> -a <args>; ...; end — Eine Funktion mit benannten Argumenten definieren.

function greet -a name; echo "Hello, $name"; end

function <name> -d '<desc>' — Eine Funktion mit Beschreibung definieren.

function serve -d 'Start dev server'; python3 -m http.server; end

functions <name> — Die Definition einer Funktion anzeigen.

functions greet

functions -e <name> — Eine Funktion löschen.

functions -e greet

funcsave <name> — Funktion nach ~/.config/fish/functions/.fish speichern.

funcsave greet

functions -n — Alle definierten Funktionsnamen auflisten.

functions -n

Kontrollfluss

if <condition>; ...; else; ...; end — Bedingte Ausführung.

if test -f config.yaml; echo 'Found'; else; echo 'Missing'; end

switch <value>; case <pattern>; ...; end — Mustervergleich (wie case/switch).

switch $os; case Linux; echo 'Linux'; case Darwin; echo 'Mac'; end

for <var> in <list>; ...; end — Über eine Liste von Werten iterieren.

for f in *.txt; echo $f; end

while <condition>; ...; end — Schleife, solange eine Bedingung wahr ist.

while test $count -lt 10; set count (math $count + 1); end

begin; ...; end — Kommandos in einem Block gruppieren (für Umleitung oder Scoping).

begin; echo stdout; echo stderr >&2; end 2>/dev/null

and <command> — Kommando nur ausführen, wenn das vorige erfolgreich war.

make build; and make test

or <command> — Kommando nur ausführen, wenn das vorige fehlschlug.

test -f .env; or echo '.env not found'

Strings & Mathematik

string match '<pattern>' <string> — Strings gegen ein Glob- oder Regex-Muster matchen.

string match '*.txt' readme.txt

string replace '<old>' '<new>' <string> — Erstes Vorkommen in einem String ersetzen.

string replace 'foo' 'bar' 'foobar'

string split '<sep>' <string> — Einen String an einem Trennzeichen aufteilen.

string split ',' 'a,b,c'

string trim <string> — Führende und nachfolgende Leerzeichen entfernen.

string trim '  hello  '

string length <string> — Die Länge eines Strings zurückgeben.

string length 'hello'

string sub -s <start> -l <len> <string> — Einen Teilstring extrahieren.

string sub -s 1 -l 5 'Hello World'

math '<expression>' — Einen mathematischen Ausdruck auswerten.

math '2 ^ 10'

Vervollständigung & History

complete -c <cmd> -s <short> -l <long> -d '<desc>' — Eine Tab-Vervollständigung für ein Kommando hinzufügen.

complete -c myapp -s v -l verbose -d 'Enable verbose output'

complete -c <cmd> -a '<args>' — Argument-Vervollständigungen für ein Kommando hinzufügen.

complete -c myapp -a 'start stop restart'

history search <term> — Die Kommando-History durchsuchen.

history search git

history delete --exact '<cmd>' — Einen bestimmten Eintrag aus der History löschen.

history delete --exact 'rm -rf /tmp/test'

history clear — Die gesamte Kommando-History löschen.

history clear

history merge — History aus anderen Fish-Sitzungen zusammenführen.

history merge

Fazit

fish nimmt dir viel Tipparbeit ab: Autosuggestions, Syntax-Highlighting und Vervollständigungen stehen ohne jede Einrichtung bereit, und mit set -U, funcsave und fish_config baust du dir dauerhaft deine eigene Umgebung. Der wichtigste Stolperstein bleibt die nicht-POSIX-kompatible Syntax: Snippets aus bash/zsh oder von Stack Overflow laufen oft nicht unverändert – export, &&/|| und Command-Substitution musst du auf set -x, and/or und fish-Klammern (…) übersetzen. Für portable Skripte, die überall laufen müssen, bleibt eine #!/bin/sh-Shebang die sichere Wahl; als komfortable interaktive Alltags-Shell spielt fish dagegen seine Stärken voll aus.

Verwandte Kommandos

  • bash – die weit verbreitete POSIX-Shell und Standard auf den meisten Linux-Systemen
  • zsh – mächtige POSIX-kompatible Shell mit umfangreichen Erweiterungen
  • env – Umgebungsvariablen anzeigen und Kommandos in angepasster Umgebung starten