McFly wertet die Bash mit künstlicher Intelligenz auf

Aus LinuxUser 07/2019

McFly wertet die Bash mit künstlicher Intelligenz auf

© Roberto Piras, 123RF

Intelligent geordnet

Für das effektive Arbeiten mit der Befehlszeile ist die History eines der wichtigsten Features. McFly erweitert deren Funktionen so, dass Sie schneller die gewünschten Befehlszeilen finden.

Die unter Linux mit Abstand beliebteste Shell ist die GNU Bourne-Again Shell oder kurz Bash. Zu deren vielen hervorragenden Funktionen zählt der integrierte Kommandoverlauf: In der sogenannten History speichert die Bash bereits ausgeführte Befehlszeilen, sodass man sie später ohne viel Tipperei erneut aufrufen kann.

Geben Sie in der Befehlszeile das Kommando history ein, erhalten Sie eine Ausgabe, die jener aus Listing 1 ähnelt. Jede Zeile beginnt mit einer aufsteigend nummerierten Zeilennummer. Die zuletzt eingegebene Befehlszeile steht ganz hinten in der History. Mit den Pfeiltasten blättern Sie im Terminals einen Schritt in der History zurück oder vor. Mit einem Druck auf die Eingabetaste übernehmen Sie die angezeigte Zeile und führen sie erneut aus.

Listing 1

$ history
[...]
  446  nano .config/GIMP/2.10/scripts/image-subdivide.scm
  447  nano .config/GIMP/2.10/scripts/slice-and-join.scm
[...]
  901  yay -Syu
  902  trizen -Syu
  903  yay -Syu
[...]
 1044  ++
 1045  ++ /tmp/
 1046  mv /tmp/*png . -v
 1047  ++
 1048  mv /tmp/*png . -v
 1049  ++
 1050  mv /tmp/linify.png .
$ history | grep slice
  447  nano .config/GIMP/2.10/scripts/slice-and-join.scm
 1051  history | grep slice

TIPP

Kombinieren Sie history mit grep, um alle Zeilen der History zu finden, in denen ein vorgegebenes Muster auftritt (Listing 1, zweiter Aufruf). Mit agrep -B anstelle von grep suchen Sie bei Bedarf “unscharf” in den Ergebnissen.

Die Bash kennt zwei Möglichkeiten, direkt in der History nach bestimmten Zeichenketten zu suchen: [Strg]+[R] sucht von der aktuellen Cursor-Position aus rückwärts, [Strg]+[S] vorwärts. Die zweite Variante ist nur dann sinnvoll, wenn Sie sich in der History bereits weiter zurückbewegt haben und sich nicht mehr an deren Ende befinden. Zudem funktioniert die Eingabe von [Strg]+[S] nur in einem entsprechend konfigurierten Terminal, normalerweise wird diese Tastenkombination blockiert.

Die durch [Strg]+[R] aktivierte Rückwärtssuche in der History zeigt die Bash durch einen speziellen Prompt an:

(reverse-i-search)`':

Der Begriff i-search steht dabei für eine inkrementelle Suche, die Sie durch jedes neu eingegebene Zeichen weiter verfeinern. Die Funktion findet die zuletzt eingegebenen Zeilen als Erste, mit jedem neu eingegebenen [Strg]+[R] springt die Suche um einen Treffer weiter in die Vergangenheit.

In der Praxis erweist sich diese Form der Suche in der History als ebenso einfach wie effektiv: Wenige geschickt gewählte Eingaben genügen in der Regel, um die gewünschte Zeile zu finden. Sie müssen allerdings wissen, wonach Sie suchen, und vor allen Dingen ein gutes Muster kennen, das schnell zum gewünschten Kommando führt. Dabei darf das Muster an jeder beliebigen Position in der Befehlszeile stehen; Sie müssen die Zeile also nicht von vorn beginnend eingeben.

Um in Listing 1 etwa das Kommando mv /tmp/linify.png . hervorzuholen, würde die Eingabe [Strg]+[R][I]+[F]+[Y] genügen. Befehlszeilen wie trizen -Syu oder yay -Syu lassen sich schnell über [Strg]+[R][Umschalt]+[S] oder [Strg]+[R][-][Umschalt]+[S] finden.

Wie Listing 1 zeigt, enthält die History jedoch üblicherweise immer wieder Zeilen, die einander sehr ähneln und sich zwar gut mit Mustern beschreiben, aber nicht gut auseinanderhalten lassen. Entsprechende Abhilfe erfordert einen neuen Ansatz.

Moderne Zeiten

Der History fehlt jegliche Möglichkeit, kontextbasiert zu agieren. Ein Beispiel: Bei vielen modernen, auf Systemd basierenden Systemen finden sich unter /var/log/journal/ große Mengen von Protokolldateien. Durch das Löschen veralteter Log-Files lässt sich oft viel Speicherplatz freigeben.

Um nachzusehen, ob und wie viele alte Log-Dateien dort lagern, wechselt man sinnigerweise in das Verzeichnis. Das Kommando du -sh ermittelt dann den von den vorhandenen Dateien verwendeten Speicherplatz. Mit find -mtime 7 sucht man dann beispielsweise alle Dateien heraus, die mehr als eine Woche nicht mehr verändert wurden, und löscht sie mit rm [...].

Sie könnten nun für diese Aufgabe in wenigen Augenblicken ein Skript oder – besser – eine Shell-Funktion schreiben, aber das Problem bleibt dasselbe: Man muss für jede Situation aktiv eine Lösung entwickeln. Wäre es da nicht viel besser, wenn die Shell beispielsweise anhand des Verzeichnisses schon erriete, was Sie vorhaben, und Ihnen die entsprechenden Aktionen bevorzugt anbietet?

Genau hier setzt McFly [1] an. Das Programm liest die bisherige History ein, analysiert sie dabei in einem synthetischen neuronalen Netz und versucht durch maschinelles Lernen Zusammenhänge in den Befehlszeilen zu erkennen. Diese Zusammenhänge dienen dann als Basis für die Vorschläge, die Ihnen die Suchfunktionen der Shell anbieten.

Im Gegensatz zum recht komplizierten Aufbau des neuronalen Netzes lässt sich der letzte Schritt beim Einsatz von McFly ganz einfach verstehen: Die normalerweise an [Strg]+[R] gebundene Funktion previous-history wird durch die neue Funktion mcfly search ersetzt.

Als Basis für die neuronale Auswertung der History und die McFly-Vorschläge bei der Suchfunktion dienen die folgenden Parameter, in der angegebenen Reihenfolge:

  • das aktuelle Verzeichnis,
  • die (dort) zuvor eingegebenen Befehlszeilen,
  • die Häufigkeit und Reihenfolge des Aufrufs,
  • ob eine Befehlszeile schon zuvor durch McFly gefunden wurde, und
  • ob das Kommando ohne Fehler durchlief.

Nach dem Einrichten von McFly (siehe Kasten “McFly installieren”) ändert sich das Verhalten der Shell: Die Tastenkombination [Strg]+[R] führt direkt zum Aufruf des Tools, die Titelleiste ändert sich entsprechend, und neue Tastenbindungen werden aktiv (Abbildung 1).

Abbildung 1: McFly erweitert die Suche nach Befehlen in der Kommando-History der Shell.

Abbildung 1: McFly erweitert die Suche nach Befehlen in der Kommando-History der Shell.

Beim Initialisieren liest McFly die bestehende History ein und wertet sie aus, was einige Zeit benötigt. Mit [Esc] verlassen Sie diesen Modus wieder und kehren direkt zur Eingabeaufforderung zurück. Über die Pfeiltasten nach oben und unten navigieren Sie in den von McFly angebotenen Empfehlungen. Geben Sie einen Suchbegriff ein, holt McFly passende Treffer aus der History.

Mit einem Druck auf [Eingabe]+ übernehmen Sie die gerade hervorgehobene Zeile aus dem Verlauf und führen das Kommando umgehend aus. Mit der Tabulatortaste hingegen übertragen Sie die hervorgehobene History-Zeile in den Eingabeprompt, ohne das Kommando gleich auszuführen. So lässt es sich noch bearbeiten, mit [Eingabe]+ führen sie es anschließend aus. Mit [F2] lassen sich einzelne Zeilen nach Rückfrage aus der Vorschlagsliste löschen.

McFly installieren

McFly findet sich noch nicht in den Paketquellen der gängigen Distributionen. Lediglich Arch Linux führt das Programm im Arch-User-Repository AUR. Hier spielen Sie das Programm mit einem AUR-Helper, etwa mittels yay -S mcfly. Das zieht über Abhängigkeiten eine ganze Reihe weiterer Pakete mit einem Gesamtumfang von einigen Hundert MByte nach.

Bei Ubuntu und vielen weiteren Distributionen benötigen Sie zur Installation das Programm Brew, das eigentlich als Paketmanager für Mac OS X entwickelt und später für Linux portiert wurde. Je nach Distribution heißt das fragliche Paket brew, linuxbrew, homebrew, homebrew-bundle oder – wie bei Ubuntu – linuxbrew-wrapper. Mit den Befehlen aus den ersten sechs Zeilen von Listing 2 spielen Sie Brew unter Ubuntu ein und konfigurieren das Programm. Nun richten Sie mit Brew sogenannte Taps ein (Zeile 7), was einige Hundert MByte zusätzlicher Software nachzieht. Dann installieren Sie mittels Brew McFly (Zeile 8), das Sie nun noch initialisieren müssen (Zeile 9).

Zum Abschluss erweitern Sie $PATH noch mit dem Ordner der ausführbaren Datei. Dazu übertragen Sie den Inhalt aus Listing 3 in die Datei ~/.bashrc. Spätestens nach einem Neustart lässt sich dann das Kommando mcfly aus dem Terminal heraus aufrufen.

Auf unserem Ubuntu-Testsystem lief dabei alles glatt, jedoch kann bei dem Prozedere einiges schiefgehen: So passiert es eventuell, dass das Verzeichnis /home/linuxbrew/ sowie der dortige Unterordner .linuxbrew/ nicht automatisch entstehen. Beim Ausführen von brew install mcfly erhalten Sie dann eine entsprechende Fehlermeldung. In diesem Fall müssten Sie das Verzeichnis selbst anlegen beziehungsweise einen symbolischen Link dorthin legen.

Kurz nach Redaktionsschluss Ende Mai hat der McFly-Entwickler auf GitHub erstmals auch fertige 32- und 64-Bit-Binaries seines Programms zum Download bereitgestellt [5]. Sie finden beide auch auf der Heft-DVD dieser Ausgabe.

Listing 2

$ sudo apt install linuxbrew-wrapper
$ brew
$ echo 'PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"' >> ~/.profile
$ echo 'MANPATH="/home/linuxbrew/.linuxbrew/share/man:$MANPATH"' >> ~/.profile
$ echo 'INFOPATH="/home/linuxbrew/.linuxbrew/share/info:$INFOPATH"' >> ~/.profile
$ PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"
$ brew tap cantino/mcfly https://github.com/cantino/mcfly
$ brew install mcfly
$ source "$(brew --prefix)/opt/mcfly/mcfly.bash"

Listing 3

if [ -f $(brew --prefix)/opt/mcfly/mcfly.bash ]; then
. $(brew --prefix)/opt/mcfly/mcfly.bash
fi

TIPP

Sollte McFly bei Ihnen mit einer kryptischen Meldung ähnlich der aus Listing 4 abstürzen, dann kämpfen Sie mit einem Bug, der auch viele andere Anwender betrifft [6]. Dabei bringen Kommandos mit Sonderzeichen das Programm aus dem Tritt. Im Test passierte dies durch den aus versehentlich eingegebenen “Befehl” ^@^@^[...]^@^@sudo. Solange die Entwickler das Problem nicht beheben, müssen Sie sich damit behelfen, einfach die betreffende Zeile mit einem Editor aus der ~/.bash_history zu löschen.

Listing 4

Unable to add cmd_tpl to commands: SqliteFailure([....])', src/libcore/result.rs:1009:5

Künstliche Intelligenz

Der Witz an McFly liegt in der zugrundeliegenden künstlichen Intelligenz, also dem zugrundeliegenden neuronalen Netzwerk. Was früher eines riesigen Aufwands bedurfte und ganze Rechenzentren benötigte, lässt sich heute (mit Abstrichen) sogar auf einem Raspberry Pi ausführen. Solche kleinen neuronalen Netze kommen heute für alle möglichen Aufgaben infrage, von der Bildbearbeitung bis hin zur Zeichen- und Mustererkennung.

Als problematisch erweist sich dabei oft die fehlende Logik dieser Systeme: Sie lernen Zusammenhänge, ohne dass sich in jedem Fall klar nachvollziehen lässt, wie sie das tun. Bei McFly kann man das Lernverhalten jedoch noch erkennen, zumindest rudimentär. Rufen Sie einen Befehl aus der Vorschlagsliste auf, platziert McFly das Kommando beim nächsten Aufruf der Vorschlagsliste weiter vorne. Weniger nachvollziehbar ist jedoch, welche Befehle initial in welcher Reihenfolge in der Vorschlagsliste auftauchen. Die hierbei verwendeten Regeln erscheinen bereits so komplex, dass es einigen Aufwands Bedarf, ihre Wirkung vorherzusagen.

Ein ganz ähnliches System begegnet uns übrigens täglich bei der Nutzung von Internet-Suchmaschinen. Auch hier lässt sich oft nicht erfassen, wie, wo und warum bestimmte Ergebnisse in der Trefferliste erscheinen und andere oft nicht. Diese Problematik tritt grundsätzlich beim Einsatz neuronaler Netze auf und ist nicht ganz ungefährlich. Daher mahnen IT-Forscher immer wieder zum vorsichtigen Umgang mit der Technik [2].

Fazit

Neben der Autovervollständigung gilt die History als zweite in der interaktiven Nutzung besonders wichtige Eigenschaft der Shell. Hier legt McFly noch eine Schippe Nutzwert obendrauf. Erfreulicherweise hat der Entwickler das Tool als unabhängiges Programm implementiert, statt in die ohnehin schon komplexe Bash selbst einzugreifen oder ein Plugin dafür zu entwickeln. Das minimiert Nebeneffekte und erlaubt ein schnelles, gefahrloses Ausprobieren des Werkzeugs.

Was die KI-Leistungsfähigkeit von McFly angeht, greift hier ein typisches Problem selbstlernender Systeme: Es ist kaum möglich, verlässliche Aussagen über die Software zu machen, da ihr Einsatz das System selbst zur Laufzeit verändert. In unserem Test lieferte McFly sehr gute Ergebnisse; meist fanden sich die gesuchten Befehlszeilen schon in der ersten Vorschlagsliste.

Geht es nur um eine Erweiterung der Shell-History, finden sich im Open-Source-Universum allerdings auch einfachere Alternativen, wie etwa die “Bash and zsh shell history suggest box” Hstr [3] und Cdhist [4], die ganz ohne neuronale Netzwerke auskommen und deutlich weniger Festplattenplatz benötigen. 

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 07/2019 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben