Bequeme Autovervollständigung, Statusleiste, Zeitmessung & mehr für dein Terminal mit „ble“

Als Video ansehen
Bereitgestellt über YouTube

Bequeme Autovervollständigung, Statusleiste, Zeitmessung & mehr für dein Terminal mit „ble“

Hast du schon mal die gleichen Befehle öfters eingegeben? Warst du schon mal auf einem Raspberry Pi oder anderen GNU/Linux-Installationen und hast dir eine Statusleiste mit Informationen zu diesem System gewünscht? Fragst du dich bei länger andauernden Vorgängen wie z.B. dem Kopieren von Dateien öfter mal, wie viel Zeit dieser Befehl in Anspruch genommen hat? Wünschst du dir Syntax-Hervorhebung beim Tippen? All das und noch mehr kann jede Standard Bash-Shell mit dem nützlichen Werkzeug namens ble, welches ich dir in diesem Beitrag vorstelle.

Was ist ble?

Ble beschreibt sich selbst als Befehlszeileneditor, der komplett in der Skriptsprache Bash geschrieben wurde. Das Werkzeug möchte GNU readline verbessern: Die Bibliothek dient zum Bearbeiten von Zeilen und wird von der Bash selbst verwendet, um Beispielsweise die Autovervollständigung mit <Tab> anzubieten: Wer beispielsweise unz gefolgt von der <Tab>Taste eintippt, erhält den Befehl unzip – oder alternativ eine Liste, falls mehrere Befehle mit dem gleichen Name gefunden werden. Die Bash bietet weitere nützliche Funktionen wie die Suche im Verlauf mit [STRG] + [R]. Auch die Suche ist jedoch recht rudimentär gehalten. Daher sind Werkzeuge wie fzf entstanden, um sie etwa mit einer Trefferliste oder zusätzlichen Operatoren (z.B. Ausschließen von Begriffen) zu ergänzen.

Ähnlich sieht es mit readline aus: Über die ~/.inputrc kann man zwar einige Einstellungen vornehmen. Einige nützliche Funktionen lassen sich damit aber nicht umsetzen. Hier übernimmt ble und bietet eine Reihe an praktischen Funktionen, womit die Konsole nicht nur übersichtlicher und produktiver wird, sondern auch etwas farbenfroher.

Installation

Auf eurem System werden Gawl & Git als Abhängigkeiten benötigt. Anschließend das GitHub-Repository klonen, Make-Skript ausführen, das Startskript von ble in die .bashrc einbetten um es bei jeder Konsolenanwendung automatisch zu laden und anschließend mit source eure .bashrc neu laden – dadurch werden die Änderungen sofort wirksam, statt erst bei der nächsten Anmeldung.

sudo apt install make gawk git

git clone --recursive --depth 1 --shallow-submodules https://github.com/akinomyoga/ble.sh.git
make -C ble.sh install PREFIX=~/.local
echo 'source ~/.local/share/blesh/ble.sh' >> ~/.bashrc
source ~/.bashrc

Das Skript legt sich selbst und seine Daten in ~/.local/share/blesh/ ab. Der erste Start dauert einige Sekunden, da hier die Initialisierung durchgeführt wird.

Diese praktischen Funktionen bietet dir ble

Anschließend ist ble aktiv: In diesem Beispiel habe ich ps eingetippt. Direkt nachdem ich mit Tippen aufhöre, zeigt ble einen Beispieleintrag aus dem Verlauf. Dieser wird als markierter Text rechts angezeigt und nur übernommen, wenn wahlweise [Tab] oder die Pfeil-nach-Rechts-Taste gedrückt wird. Tippt man weiter oder drückt Enter (weil man etwa ps ohne Parameter aufrufen möchte), ignoriert das Werkzeug die Vorschläge. Sie erscheinen weiterhin, so lange es zum eingegebenen Befehl etwas passendes finden kann.

Das passiert Permanent im Hintergrund, während du tippst. Die Vorschläge können sich daher ändern und sind vielseitig: Es wird auf verfügbare Befehle in $PATH, zuvor ausgeführte Befehle aus der Bash-Historie sowie existierende Dateien/Ordner im Dateisystem zurückgegriffen. In folgendem Beispiel wird daher /etc/resolv.conf vorgeschlagen, obwohl ich diesen Befehl auf dem Testsystem noch nie ausgeführt habe.

Dabei versucht ble, den wahrscheinlichsten Treffer anzuzeigen. Teilweise gibt es aber auch mehrere: In diesem Beispiel etwa resolv.conf.bak und resolvconf.conf. Mit der <Tab> Taste wird darunter eine Auswahl aller Treffer angezeigt, durch die man durch erneutes Drücken von <Tab> navigieren kann. Übernommen wird er mit <Enter>.

Bereits bei diesen einfachen Demonstrationen sieht man, wie ble durch verschiedene Farben versucht, die Eingabe übersichtlicher zu gestalten: Der Befehl selbst (hier cat) wird grün, der Ordner /etc blau und der Dateiname resolvconf.conf weiß. Das geschieht auch an anderen Stellen, etwa bei Parametern. Wird ein Befehl mit Fehlercode (= Rückgabewert ungleich 0) beendet, zeigt es den Rückgabewert in einer eigenen roten Zeile an.

Zum Vergleich: Die normale Bash alleine (also ohne ble) würde an dieser Stelle nichts unternehmen: Gibt euch die aufgerufene Software keine Fehlermeldung aus (wie z.B. grep), erscheint keinerlei Ausgabe. Dass aus Sicht des Programms ein Fehlerfall aufgetreten ist, seht ihr nur durch manuelle Ausgabe von $?: Die Variable enthält den Exit-Code des zuletzt ausgeführten Befehls. Hier 1, was grep zurück liefert, wenn der gesuchte Text nicht gefunden wurde.

Die Konfigurationsdatei bietet noch viel mehr nützliche Dinge

Viele weitere Funktionen des Kommandozeilenwerkzeugs sind standardmäßig nicht eingeschaltet. Standardmäßig lädt ble die Konfigurationsdatei ~/.blerc, sofern vorhanden. Ihr könnt diese mit einem Texteditor eurer Wahl anlegen und die gewünschten Einstellungen aus den folgenden Abschnitten setzen. Diese werden nicht sofort wirksam, der Befehl ble-reload lädt die Datei neu.

vim ~/.blerc
ble-reload

Aber Vorsicht: Fehler in der .blerc können dazu führen, dass die Konsole nicht mehr funktionsfähig ist! Ich empfehle daher, vorher einen zweiten Reiter zu öffnen, in dem ihr eine weitere Konsole/SSH-Sitzung öffnet. Im Fehlerfall könnt ihr diese nutzen, um das Problem an der .blerc zu korrigieren und in einer neuen Konsole zu testen.

Gerade beim ausprobieren passierte es in meinen Tests gelegentlich, dass die Änderungen nicht wie gewünscht wirksam wurden. Hier half in den meisten Fällen das Löschen des Zwischenspeichers (Cache). In einem hartnäckigen Fall funktioniert es nach dem Öffnen einer neuen Konsole/SSH-Verbindung.

rm -rf $_ble_base_cache

Statuszeile mit eigenen Informationen, Exitcode & Trennlinien

Mit ble kann man auch eine Statuszeile am unteren Ende des Bildschirms einblenden. Neben vorgefertigten Variablen lassen sich Befehle ausführen, deren Ausgabe eingefügt wird: Folgendes Beispiel ist für den Raspberry Pi optimiert und

function ble/prompt/backslash:custom/memoryTime {
  ble/prompt/unit/add-hash '$SECONDS'
  ble/prompt/process-prompt-string "💾$(free -h | grep Mem | awk '{printf $3 "/" $2}')\r⏰\t"
}
bleopt prompt_status_line="🐧$(uname -o) $(uname -r) $(uname -m)\r📟$(dmesg | grep 'Machine model' | awk -F': ' '{print $2}')\r\q{custom/memoryTime}"
bleopt prompt_status_align=$'justify=\r'

Dieses Beispiel zeigt links unten die Kernel-Version sowie Architektur an. In der Mitte Modell und Revision des Raspberry Pi. Daneben belegter/insgesamt verfügbarer Arbeitsspeicher und Uhrzeit. Die letzten beiden werden automatisch aktualisiert, allerdings nur, wenn man aktiv ist. Hört das Tippen auf, pausiert ble die Aktualisierung. Alle Daten sollen zentriert dargestellt werden, anhand des Tabs ausgerichtet. Für die meisten Angaben werden Shell-Befehle ausgeführt, d.H. man kann viele weitere Daten darstellen, etwa den Akkustand eines Notebooks (wenngleich dies etwas Leistung kostet). Außerhalb des Raspberry Pis sollte man die Modellanzeige entfernen, da sie unter X86 Desktops/Servern nicht wie auf dem Raspberry Pi OS funktioniert:

bleopt prompt_status_line="🐧$(uname -o) $(uname -r) $(uname -m)\r\q{custom/memoryTime}"

Interessant finde ich zudem die Ausführungszeit, Anzeige von Fehlercodes (Exitcode != 0) und mit dem promt_ruler eine Trennlinie. So wird auf den ersten Blick klar, wo die Ausgabe eines Befehls anfängt bzw. endet.

# Zeigt die Ausführungszeit & CPU-Last an, wenn der Befehl > 10 ms benötigt hat
bleopt exec_elapsed_mark=$' \\e[94m[↪️[%s 📈%s%%]\e[m'
bleopt exec_elapsed_enabled='usr+sys>=10'
# Exitcode (nur angezeigt, wenn nicht gleich null)
bleopt exec_errexit_mark=$' \e[91m[⚡️RC ➡️ %d]\e[m'
# Blaue Trennlinie zwischen den Befehlen
bleopt prompt_ruler=$'\e[94m-' 

Die komplette Konfigurationsdatei ~/.blerc:

function ble/prompt/backslash:custom/memoryTime {
  ble/prompt/unit/add-hash '$SECONDS'
  ble/prompt/process-prompt-string "💾$(free -h | grep Mem | awk '{printf $3 "/" $2}')\r⏰\t"
}
bleopt prompt_status_line="🐧$(uname -o) $(uname -r) $(uname -m)\r📟$(dmesg | grep 'Machine model' | awk -F': ' '{print $2}')\r\q{custom/memoryTime}"
bleopt prompt_status_align=$'justify=\r'
# Zeigt die Ausführungszeit & CPU-Last an, wenn der Befehl > 10 ms benötigt hat
bleopt exec_elapsed_mark=$' \\e[94m[↪️[%s 📈%s%%]\e[m'
bleopt exec_elapsed_enabled='usr+sys>=10'
# Exitcode (nur angezeigt, wenn nicht gleich null)
bleopt exec_errexit_mark=$' \e[91m[⚡️RC ➡️ %d]\e[m'
# Blaue Trennlinie zwischen den Befehlen
bleopt prompt_ruler=$'\e[94m-' 

Fazit: Nützlich und eine nette Spielerei dazu

In ble sind einige nützliche Funktionen enthalten, die teils von der Z-Shell inspiriert wurden, wie etwa die automatische Vervollständigung von Befehlen – der Hauptgrund, warum ich mir ble genauer angeschaut habe. Die automatische Ausgabe des Exit-Codes ist nicht nur für weniger erfahrene Nutzer hilfreich. Auch wenn man weiß, dass man diesen mit $? erfährt, ist es so doch deutlich einfacher. Mit den Farben und ein paar Unicode-Emojis sieht die Konsole zudem auch noch ansprechender aus.

Durch die hohe Anpassbarkeit kann man Stunden damit verbringen, sich seine Shell bis hin zu Details wie z.B. einzelnen Farben recht genau anzupassen. Sicherlich mögen manche Funktionen unter ZSH & co. einfacher und teilweise sogar mit Boardmitteln realisierbar sein. Manch einer möchte jedoch vielleicht nicht unbedingt seine komplette Shell wegen einzelnen Funktionen wechseln. Hier sehe ich ble als eine sinnvolle Ergänzung.

Weitere Infos

Das Werkzeug lässt sich stark anpassen (z.B. Farben) und Erweitern (etwa eigene Befehle aufrufen und die Ausgabe einbetten). Im offiziellen Handbuch sind die verfügbaren Einstellungen dokumentiert, vieles aus den folgenden Abschnitten befindet sich in §4 Edit. Ergänzend empfand ich manchmal ein Blick in die blerc.template Datei des Repositorys als hilfreich: Das ist eine Art Beispieldatei, in der die verschiedenen Einstellungsmöglichkeiten aufgelistet sind, oft mit einer mehr oder weniger ausführlichen Erklärung. Ähnlich, wie man das von vielen GNU/Linux-Programmen kennt, die solch eine Datei bei der Installation anlegen.

Falls euch einzelne Funktionen von ble nicht gefallen, könnt ihr so ziemlich alle davon einzeln deaktivieren. Dazu müsst ihr eine bestimmte Variable auf einen leeren Wert setzen. Meist ist es diejenige, in der man das Format anpassen kann. Die verfügbaren werden in der README aufgelistet. Folgende dient beispielsweise für die Formatierung der benötigten Ausführungsdauer, die auf eine leere Zeichenkette gesetzt und damit deaktiviert wird:

bleopt exec_elapsed_mark=

Leave a Reply