ADMIN
2022
07
2022-06-29T12:00:00
Mobiles Arbeiten
PRAXIS
054
Open-Source-Tipp
Tools
Modern Unix
Neues Werkzeug
von Thorsten Scherf
Veröffentlicht in Ausgabe 07/2022 - PRAXIS
Auf jedem Linux-System ist eine Vielzahl an GNU-Tools installiert, etwa für den Umgang mit Dateien. Teilweise sind diese Werkzeuge aber schon knapp 40 Jahre alt. Unter dem Namen "Modern Unix" stehen deshalb neue Varianten als Alternative zur Verfügung. Der Open-Source-Tipp in diesem Monat stellt einige dieser neuen Tools vor und beleuchtet deren Vorteile.

Geht es um das Suchen von Dateien, kommt natürlich "find" zum Einsatz. Wer nach bestimmten Ausdrücken in Dateien sucht, der greift automatisch zu "grep". Und der Inhalt einer Datei wird natürlich mit "cat" oder "less" auf dem Monitor dargestellt. Und so gibt es noch jede Menge weiterer GNU-Tools [1], die quasi zum Standard geworden sind, wenn es um die Ausführung von bestimmten Arbeiten geht.
In die Jahre gekommen
Viele dieser Tools sind jedoch recht alt und lassen einige Features vermissen, die in der heutigen Zeit hilfreich wären. Auch die Syntax ist teilweise recht umständlich, sodass sich Nutzer die eine oder andere Änderung anden Tools herbeisehnen. Das folgende Beispiel verdeutlicht dies recht anschaulich. Stellen Sie sich vor, Sie wollen alle Dateien im Order "/tmp" finden, die mit dem String "foo" beginnen. Dabei soll die Groß- und Kleinschreibung keine Rolle spielen.
Außerdem interessieren Sie sich nur für reguläre Dateien und wollen auch keine Fehlermeldungen sehen, wenn "find" beispielsweise versucht, einen Unterordner zu durchsuchen, für den Sie aber gar nicht die notwendigen Zugriffsrechte besitzen. Der hierfür notwendige Befehl sieht dann wie folgt aus:
Geht es um das Suchen von Dateien, kommt natürlich "find" zum Einsatz. Wer nach bestimmten Ausdrücken in Dateien sucht, der greift automatisch zu "grep". Und der Inhalt einer Datei wird natürlich mit "cat" oder "less" auf dem Monitor dargestellt. Und so gibt es noch jede Menge weiterer GNU-Tools [1], die quasi zum Standard geworden sind, wenn es um die Ausführung von bestimmten Arbeiten geht.
In die Jahre gekommen
Viele dieser Tools sind jedoch recht alt und lassen einige Features vermissen, die in der heutigen Zeit hilfreich wären. Auch die Syntax ist teilweise recht umständlich, sodass sich Nutzer die eine oder andere Änderung anden Tools herbeisehnen. Das folgende Beispiel verdeutlicht dies recht anschaulich. Stellen Sie sich vor, Sie wollen alle Dateien im Order "/tmp" finden, die mit dem String "foo" beginnen. Dabei soll die Groß- und Kleinschreibung keine Rolle spielen.
Außerdem interessieren Sie sich nur für reguläre Dateien und wollen auch keine Fehlermeldungen sehen, wenn "find" beispielsweise versucht, einen Unterordner zu durchsuchen, für den Sie aber gar nicht die notwendigen Zugriffsrechte besitzen. Der hierfür notwendige Befehl sieht dann wie folgt aus:
/usr/bin/find /tmp -type f -iname "foo*" 2> /dev/null
/tmp/foo123
/tmp/Foo
/tmp/foo
Natürlich sind all diese Optionen in der Hilfe-Seite zu "find" beschrieben und ist die Herleitung auch recht einfach. Trotzdem wäre es doch schön, wenn das Tool für Standardabfragen eine einfachere Syntax verwenden würde. Und genau hier kommt "fd" [2] ins Spiel. Es gehört zu einer Sammlung neuer Anwendungen, die unter dem Namen "Modern Unix" [3] bekannt geworden sind und eine Alternative zu den GNU-Tools anbieten. Der folgende Aufruf von "fd" liefert exakt das gleiche Ergebnis wie "find", allerdings ist hierfür wesentlich weniger Tipparbeit notwendig:
fd foo /tmp
/tmp/Foo
/tmp/foo
/tmp/foo123
Hinzu kommt, dass "fd" bei der Suche innerhalb von Git-Repositories den Inhalt der Datei ".gitignore" auswertet und somit bestimmte Dateien erst gar nicht im Suchergebnis anzeigt. Das folgende Beispiel verdeutlicht dies:
/usr/bin/cat /tmp/.gitignore
foo123
fd foo /tmp
/tmp/Foo
/tmp/foo
Natürlich bietet das Tool eine Vielzahl von Optionen an, mit denen Sie das Standardverhalten ändern können, aber im Gegensatz zu "find" kommen bei "fd" von Haus aus sinnvolle Standardeinstellungen zum Einsatz, die den Umgang mit dem Tool vereinfachen.
Reguläre Ausdrücke
Zu erwähnen wäre auch, dass das Tool in Rust geschrieben ist und somit die Rust-Regex-Bibliothek, oder "Crate", wie es korrekterweise in der Rust-Welt genannt wird [4], zum Einsatz kommt. Im Vergleich zur PCRE2-Regex [5] liefert diese gerade bei vergleichsweise komplexen Suchausdrücken schnellere Ergebnisse. Die Syntax ist dabei jedoch fast identisch mit PCRE2, wie das folgende Beispiel zeigt:
fd --no-ignore --regex '^[Ff].*[0-9]$' /tmp
/tmp/foo123
Die Option "--no-ignore" hebt das Standardverhalten, eine eventuell vorhandene ".gitignore"-Datei auszuwerten, auf und somit erscheint im Suchergebnis nun auch wieder die Datei "foo123".
ripgrep statt grep
Ganz ähnlich verhält es sich mit dem Tool "ripgrep" [6]. Wie der Name bereits vermuten lässt, handelt es sich hierbei um einen modernen Ersatz zu "grep". Allerdings liefert das Werkzeug wesentlich schnellere Suchergebnisse und respektiert ebenfalls eventuell vorhandene ".gitignore"-Dateien. Binäre und verstecke Files werden auch von diesem Tool ignoriert. Allerdings können Sie durch die Optionen "--binary" und "--hidden" diese wieder mit in die Suche einschließen. Wie auch "fd" verwendet "ripgrep" die Rust-Regex-Engine, die Sie bei Bedarf mit der Option "--pcre2" durch die PCRE2-Regex-Engine ersetzen können.
Das Tool liefert viele interessante Features. Beispielsweise lässt sich eine Suche auf bestimmte Dateitypen eingrenzen. Hierfür steht die Option "-t" zur Verfügung. Möchten Sie also beispielsweise eine Suche nur in Python-Dateien durchführen, rufen Sie "rg" wie folgt auf:
rg -t py 'class cert_request' ~/git/freeipa
/home/tscherf/git/freeipa/ipaserver/plugins/cert.py
604:class cert_request(Create,BaseCertMethod,VirtualCommand):
Um einen bestimmten Dateitypen stattdessen von der Suche auszuschließen, nutzen Sie die Option "-T". Schön ist auch, dass "ripgrep" standardmäßig die Zeilennummer der Matches anzeigt und dieses farbig hervorhebt. Mittels der Option "-i" weisen Sie "rg" an, die Groß- und Kleinschreibung des Suchbegriffs zu ignorieren:
rg -i hello /tmp
/tmp/Foo
1:Hello World
/tmp/foo
1:hello
2:Hello
3:HELLO World
Ansonsten stehen viele der von "grep" bekannten Optionen auch in "ripgrep" zur Verfügung, sodass ein Umstieg sehr leicht fällt.
bat statt cat
Weiter geht es mit "bat" [7]. Dieses Tool ersetzt "cat" und liefert nicht nur neue praktische Features, sondern präsentiert die Dateiausgabe auch optisch sehr ansprechend. Anders als "cat" bietet "bat" standardmäßig ein Syntax-Highlighting an und unterstützt aktuell 158 Sprachen. Sollte die automatische Erkennung nicht klappen, können Sie durch die Option "--language" die gewünschte Sprache einfach mit übergeben.
Für das Syntax-Highlighting stehen zusätzlich unterschiedliche Themes zur Verfügung. Welche dies sind, sehen Sie mit dem Befehl bat --list-themes
. Mit der Option "--theme" können Sie dann das gewünschte Theme auswählen oder dieses alternativ einfach in der Shell-Variablen "BAT_THEME" hinterlegen. Sämtliche Konfigurationsoptionen können Sie allerdings auch in einer Datei abspeichern. Auf Linux-Systemen lautet diese "~/.config/bat/config".
Mit dem folgenden Befehl erzeugen Sie eine Beispieldatei: bat --generate-config-file
. Die Ausgabe einer Datei leitet "bat" automatisch an einen Pager weiter, ohne dass Sie hierfür umständlich mit Pipes hantieren müssen. Welcher Pager zum Einsatz kommt, können Sie mit der Option "--pager" definieren. Ansonsten greift "bat" einfach auf die Shell-Variable "PAGER" zurück und verwendet den Pager, der dort hinterlegt ist – was in den meisten Fällen "less" sein sollte.
Sehr gut gelungen ist auch die Integration mit Git. Haben Sie Modifikationen an einer Datei in einem lokalen Git-Repository vorgenommen, diese aber noch nicht wieder eingecheckt, zeigt "bat" die modifizierten Zeilen am Seitenrand an.
Dabei werden Sie auch feststellen, dass "bat" für die Ausgabe einen bestimmten Style verwendet: Neben Zeilennummern wird der Dateiname als Header getrennt vom eigentlichen Inhalt der Datei dargestellt. Mithilfe der Option "--style" definieren Sie den gewünschten Stil selbst. Standardmäßig kommt hier "full" zum Einsatz. Möchten Sie lediglich den Inhalt ohne stylische Elemente sehen, verwenden Sie stattdessen einfach "plain". Eine Liste sämtlicher verfügbaren Styles finden Sie in der Hilfeseite zu "bat".
Fazit
Mit der Sammlung "Modern Unix" steht Ihnen eine Reihe von Werkzeugen zur Verfügung, die allesamt eine Alternative zu den doch recht alten GNU-Tools darstellen. Diese bieten nicht nur neue interessante Features, wie beispielsweise eine Integration mit Git, sondern sorgen auch optisch für Abwechselung auf der Kommandozeile.
Der Open-Source-Tipp in diesem Monat konnte natürlich nur eine kleine Auswahl an Software präsentieren, aber über die nächsten Monate wird sicherlich noch das ein oder andere Tool der "Modern Unix"-Sammlung erneut Thema an dieser Stelle sein.
(dr)