4 Interessante und Ungewöhnliche Linux-Shells

Indeks
  1. fish: Die freundliche interaktive Shell
  2. Murex: Intuitiv und inhaltsbewusst
  3. Nushell: Eine neue Art von Shell
  4. PowerShell: Die Windows-Shell, jetzt für alle

Entdecken Sie die Vorteile moderner Linux-Shells wie fish, Murex und Nushell für effizientere Befehlsausführung und Datenverarbeitung, die über die traditionelle Bash hinausgehen.

Als Linux-Nutzer führen Sie wahrscheinlich Befehle in Ihrem Terminal mit einer der beiden Shells aus: bash oder zsh. Vielleicht haben Sie von deren Vorgängern gehört, wie sh oder csh; möglicherweise sind Sie sogar mit neueren Shells wie fish vertraut. Aber was ist mit diesen modernen Alternativen: Können sie einen bedeutenden Unterschied in Ihrer täglichen Arbeit machen?

fish: Die freundliche interaktive Shell

Die fish-Shell ist eine der bekanntesten modernen Alternativen zu welcher Shell auch immer Ihre Distribution standardmäßig verwendet. Sie legt Wert auf benutzerfreundliche Funktionen, mit leistungsstarker Tab-Vervollständigung, Syntaxhervorhebung und Befehlsvorschlägen.

fish ist für Linux und macOS verfügbar, sodass der Einstieg so einfach sein kann wie das Ausführen von brew install fish oder apt-get install fish.

Wenn Sie mit der ausgezeichneten Tab-Vervollständigung von zsh vertraut sind, werden Sie sich bei fish sofort wohlfühlen. Beginnen Sie, einen Befehl einzugeben, und fish schlägt eine Vervollständigung in Grau nach den bereits eingegebenen Zeichen vor:

Dieser Vorschlag basiert auf Ihrer Befehlsgeschichte und gültigen Dateipfaden, sodass er oft sehr nützlich ist. Geben Sie mehr Buchstaben ein, und fish verfeinert seinen Vorschlag. Sie können den Vorschlag akzeptieren, indem Sie die Rechtstaste drücken, und durch Drücken von Tab erhalten Sie eine Auswahl an Optionen, die Sie mit den Pfeiltasten navigieren können:

Wenn Sie Vorschläge für den Befehl selbst anzeigen, sehen Sie alle übereinstimmenden Befehle mit Informationen darüber, was jeder von ihnen tut:

Sie können auch die Funktion zur automatischen Vorschlagsanzeige nutzen, um verfügbare Optionen zu sehen, indem Sie nach einem einzelnen - Zeichen die Tab-Taste drücken:

fish ist hochgradig konfigurierbar, nimmt jedoch oft einen anderen Ansatz als die gängigen Shells wie Bash und Zsh. Zum Beispiel ist das Anpassen Ihrer Eingabeaufforderung eines der ersten Dinge, die Sie lernen, wenn Sie mit dem Terminal arbeiten, aber fish wird standardmäßig mit einer recht einzigartigen Eingabeaufforderung geliefert:

Diese Eingabeaufforderung gibt Verzeichnisnamen in der aktuellen Hierarchie auf einen Buchstaben ab und druckt den Branch-Namen, wenn Sie sich in einem Git-Repository befinden, sodass sie standardmäßig ziemlich nützlich ist. Aber Sie können die Eingabeaufforderung auch mit einer fish-Funktion ändern, indem Sie Folgendes in die Befehlszeile eingeben:

function fish_prompt; echo "% "; end

Der funktionale Ansatz ist ein großer Schritt über das PS1 von Bash hinaus, das eine Zeichenfolgenvariable mit einer vordefinierten Syntax ist.

Ähnlich wie fish die PATH-Variable unterstützt, ist es intern jedoch eine Listenvariable und keine Zeichenfolge. Dies erleichtert die Modifikation mit einer Hilfsfunktion namens fish_add_path:

fish_add_path ~/myprogs

Eine benutzerfreundliche Möglichkeit zur Konfiguration von fish bietet dessen Weboberfläche. Führen Sie einfach fish_config von der Befehlszeile aus, und fish öffnet ein Browserfenster mit einer einfachen Benutzeroberfläche, die es Ihnen ermöglicht, verschiedene Einstellungen zu ändern:

Sie müssen sich der Unterschiede von fish bewusst sein, insbesondere bei gängigen Funktionen, mit denen Sie möglicherweise vertraut sind. Zum Beispiel verwende ich oft Bashs !$, um das letzte Argument des vorherigen Befehls zu wiederholen, z. B.

ls README.md
wc -l !$

fish unterstützt dasselbe !$ nicht – es unterstützt auch $0, $? (stattdessen wird $status verwendet) und !! nicht. Sie können das letzte Argument des vorherigen Befehls mit Alt + Hoch einfügen, und es gibt Äquivalente für den Rest, aber Sie müssen sich möglicherweise an einige sehr tief verwurzelte Verhaltensweisen anpassen, um sich an diese Alternativen zu gewöhnen.

Aufgrund solcher Unterschiede ist fish nicht POSIX-konform, was bedeutet, dass seine Skripte nicht mit POSIX-konformen Shells wie Bash und Zsh kompatibel sind.

Murex: Intuitiv und inhaltsbewusst

Murex ist eine relativ neue Shell (2017), die in Go geschrieben wurde. Diese Shell bietet native Unterstützung für komplexe Datenformate, einschließlich Wörterbuchobjekten, CSV und JSON. Das bedeutet, dass Sie Dinge tun können wie:

object = %{ color: "red", "size": "large" }

Der obige Code definiert eine JSON-Variable, die Sie genau wie ein strukturiertes Objekt in JavaScript verwenden können:

Um von ihrem strukturierteren Ansatz Gebrauch zu machen, bietet Murex eigene Alternativen zu gängigen Befehlen an. Zum Beispiel ist der Befehl f ähnlich wie der ls-Befehl; er listet Dateien im aktuellen Verzeichnis auf, gefiltert nach einem von mehreren verfügbaren Flags:

f +f 
f +x -d 

Der große Unterschied ist hier jedoch, dass die Ausgabe ein JSON-Array anstelle einer Liste von...

Ebenso führt der Befehl g denselben Typ von Globbing-Operation aus, die Sie von Bash gewohnt sind:

g *.md

Sie können die erweiterte Pipe-Syntax von Murex verwenden, um mit strukturierten Daten von Befehlen zu arbeiten. Traditionelle Unix-Shells geben Daten als Strings über Pipes weiter, aber die leistungsfähigeren Datentypen von Murex benötigen ihre eigene spezielle Pipe-Form.

Die generische Pipe (=>) ähnelt einer klassischen Pipe (|), konvertiert jedoch die Ausgabe in ein benutzerfreundlicheres Format für externe Befehle, die Murex-Datentypen nicht unterstützen. Zum Beispiel:

Während die traditionelle Pipe die Ausgabe von f in eine einzige Zeile umwandelt, formatiert die generische Pipe sie als Liste ihrer Inhalte, mit einem Element pro Zeile, sodass der wc-Befehl die Anzahl der Elemente korrekt berichten kann.

Dieses Konzept funktioniert am besten mit den Datenmanipulationsoperatoren von Murex. Diese ermöglichen es Ihnen, auf strukturierte Daten zuzugreifen und diese zu ändern, sodass Sie die Ausgabe von einem Befehl in einen anderen pipen können, der diese Daten neu formatiert oder weiterverarbeitet. Hier ist ein Beispiel:

config | [[ /shell/syntax-highlighting ]]

In diesem Befehl greift die [[ ]]-Syntax auf das verschachtelte Element innerhalb der Ausgabe von config zu:

Meine größte Beschwerde über Murex ist die Dokumentation – oder deren Fehlen. Zum Beispiel ist die Standardaufforderung einfach "murex", was nicht sehr nützlich ist. Ich bin ein ganzes Stück in ein Kaninchenloch gefallen, als ich versuchte herauszufinden, wie ich dies ändern kann; wie Fish unterstützt Murex nicht die Standardvariable $PS1.

Im Gegensatz zu Fish versäumt es Murex jedoch, klar zu erklären, wie man seine Eingabeaufforderung ändert. Ich fand widersprüchliche (möglicherweise veraltete) Informationen über das onPrompt-Ereignis, das wie ein komplizierter (wenn auch leistungsstarker) Weg aussah, die Eingabeaufforderung einzustellen – ähnlich dem funktionalen Ansatz von Fish. Ich konnte es nicht zum Laufen bringen, fand jedoch eine Konfigurationseinstellung, die zu tun schien, was ich wollte:

config: set shell prompt {
 exitnum -> !if {
 out "{RESET}{YELLOW}${pwd_short} {GREEN}»{RESET} "
 } else {
 out "{RESET}{YELLOW}${pwd_short} {RED}»{RESET} "
 }
}

Dies ist eine nützliche Eingabeaufforderung, die nicht nur eine abgekürzte Version des aktuellen Pfads anzeigt, sondern auch das »-Symbol je nach Status des letzten Befehls einfärbt. Ich konnte jedoch keine Dokumentation zu dieser Konfigurationseinstellung finden; ich musste dieses Snippet in einem zufälligen GitHub Gist aufdecken.

Nushell: Eine neue Art von Shell

Viele Shells sind oberflächlich ähnlich, ihre Unterschiede beschränken sich auf grundlegende Skripting-Funktionen oder subtile Syntaxänderungen. Dies gilt nicht für Nushell (Nu), ein Shell-Programm, das in Rust geschrieben wurde und 2019 veröffentlicht wurde. Sobald Sie Ihren ersten Befehl unter Nu ausführen, werden Sie einen großen Unterschied sehen:

Dies liegt daran, dass Nu – wie Murex – strukturierte Daten unterstützt. Nu geht jedoch einen Schritt weiter und bietet eigene Entsprechungen gängiger Befehle (oder Built-ins) wie ls. Dieser Ansatz kann eine Menge Ausgabe erzeugen, obwohl die Tabellenformatierung in der Regel leichter zu lesen ist als die normale Bash-Form:

Sie können Nushell auch verwenden, um Daten von einem Befehl zu einem anderen zu pipen und dabei von seiner Struktur zu profitieren. Zum Beispiel können Sie sehr einfach Daten von einer Web-API abrufen und extrahieren, indem Sie zwei von Nushells Built-ins, http und get, verwenden:

~/repos/nushell> http get https://speed.cloudflare.com/meta | get region

Der Befehl get ermöglicht es Ihnen, strukturierte Daten zu verarbeiten. In diesem Fall können Sie eine gleichwertige Kurzform verwenden:

(http get https://speed.cloudflare.com/meta).region

Die Standardverhalten und die klare, moderne Benutzeroberfläche von Nushell machen es zu einer hervorragenden Wahl für eine Next-Generation-Shell. Es ist gut dokumentiert, einfach zu bedienen und tut meistens, was man erwarten würde.

Ich habe nur ein paar Probleme mit Nushell. Das erste ist ziemlich trivial, angesichts der heutigen Speicherkosten, aber es ist eine große Shell im Vergleich zu den Alternativen: 39MB. Zum Vergleich: zsh ist nur 1,3MB.

Ich habe auch einige seltsame Verhaltensweisen mit ls -d beobachtet. Dies ist ein zeitaufwändiger Aufruf, da er ein wenig wie du funktioniert und die Gesamtgröße von Verzeichnissen summiert. Aber ich habe gesehen, dass seine Ausgabe aus einem unbekannten Grund in separate Tabellen aufgeteilt wurde, was wie ein kleiner Fehler wirkte.

PowerShell: Die Windows-Shell, jetzt für alle

PowerShell ist ein Microsoft-Programm, das Windows-Nutzern ähnliche Funktionen wie Linux-Shells bietet. Obwohl es stark in das Windows-Betriebssystem integriert ist, ist seit 2016 auch eine Version für Linux- und Mac-Nutzer verfügbar.

Sie können PowerShell auf dem Mac mit Homebrew installieren (brew install --cask powershell) und auf Linux mit den Anweisungen für Ihre spezifische Distribution. Nach der Installation starten Sie es mit dem Befehl pwsh.

PowerShell bringt vertraute MS-DOS-Befehle wie dir mit sich:

Kombinieren Sie es mit einem Tool wie Microsofts Edit für Mac und Linux, und Sie könnten fast glauben, Sie verwenden MS-DOS, wenn Sie möchten.

Da PowerShell wie eine andere Shell implementiert ist, haben Sie weiterhin Zugriff auf vertraute Unix-Befehle und können die DOS-Äquivalente ignorieren, wenn Sie das bevorzugen.

Der wahre Wert von PowerShell liegt darin, dass es, ähnlich wie Murex und Nushell, ein leistungsstarkes Datenmodell hat, das auf Objekten anstatt auf Strings operiert. Dies wird beim Verketten von Befehlen in einer Pipeline besonders deutlich:

Get-ChildItem -Path repos/ov | Select-Object -Property Size

Hier sind Get-ChildItem und Select-Object Cmdlets, native Befehle, die kleine Aufgaben innerhalb einer Pipeline ausführen. Cmdlets sind in .NET-Sprachen geschrieben, und PowerShell enthält eine API, die Cmdlets verwenden können, um Low-Level-Aufgaben auszuführen.

PowerShell fühlt sich für diejenigen von uns, die sich an die Nutzung von DOS vor vierzig Jahren erinnern, wie eine Reise in die Vergangenheit an. Aber ich vermisse diese Erfahrung nicht wirklich; es gibt Gründe, warum ich zu Linux und macOS gewechselt bin. Diese Shell wird für mich eine interessante Kuriosität bleiben, ist aber sicher nützlicher, wenn Sie sowohl Windows als auch Linux verwenden.

Alternative Shells scheinen kurz davor zu stehen, durchzubrechen, ohne das Ungeheuer Bash wirklich zu verdrängen. Die meisten von uns werden bei der Standard-Shell bleiben, aber es ist schön, Optionen zu haben, besonders wenn sie so einzigartige und leistungsstarke Funktionen bieten. Letztendlich denke ich jedoch, dass sie eine Nische bleiben werden, bis sie die POSIX-Konformität vollständig annehmen.

Bist du neugierig auf weitere Artikel wie 4 Interessante und Ungewöhnliche Linux-Shells? Entdecke spannende Inhalte in der Kategorie Linux.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Go up