Mithilfe von Smenu integrieren Sie im Handumdrehen eine Auswahl in ein Shell-Skript und brauchen dabei auf Komfort nicht zu verzichten.
Wer häufig für die Shell programmiert, sieht sich früher oder später damit konfrontiert, ein Auswahlmenü zu gestalten. Das erfordert etliche Code-Zeilen zusätzlich – es sei denn, Sie greifen auf Smenu zurück. Bei diesem Tool reduziert sich der Aufwand für ein Menü oft auf einen Einzeiler. Eine Reihe von Parametern eröffnet zudem die Möglichkeit, das Design anzupassen und dem Benutzer die Arbeit etwas zu vereinfachen.
Sie finden die Software auf der Projektseite https://github.com/p-gen/smenu, die auch Anweisungen für die Installation sowie einige nützliche Hinweise zum Gebrauch enthält. Das Smenu-Wiki enthält Links zu zwei Youtube-Filmen, die den praktischen Einsatz des Programms demonstrieren. Das Handbuch gibt einen strukturierten Überblick über die Möglichkeiten.
Grundfunktion
Der minimale Einsatz von Smenu besteht darin, die Ausgabe eines Befehls per Pipe an das Kommando smenu durchzureichen. Mit Befehl | smenu erhalten Sie eine Auswahl innerhalb einer Zeile. Ein zeilenweise aufgebautes Menü erzeugen Sie mit Befehl | smenu -c (Abbildung 1)

Abbildung 1: In der einfachsten Form rufen Sie Smenu in der Pipe auf und überlassen es dem Programm, die Ausgabe in Form eines einzeiligen Menüs aufzubereiten.
Für ein frei definiertes Menü übergeben Sie die Auswahlpunkte über das Echo-Kommando. Die Beispiele in Abbildung 2 zeigen allerdings nur die rudimentärste Form: Ohne Variablen ergibt der Einsatz des Tools keinen Sinn.

Abbildung 2: Möchten Sie die Auswahlpunkte mit eigenem Text versehen, dann nutzen Sie den Echo-Befehl.
Die Tabelle “Optionen” listet die für den Alltag wichtigsten Aufrufoptionen von Smenu. Durch [Eingabe]+ wählen Sie einen Menüpunkt aus, mit [Q] beenden Sie das Menü ohne Auswahl. Um innerhalb der Auswahl zu suchen, nutzen Sie bei laufendem Menü den Schrägstrich (/) und geben anschließend den Suchbegriff ein.
Der Cursor stoppt beim ersten Treffer, der Hintergrund erscheint dabei blau anstelle von schwarz. Warten Sie sieben Sekunden, fällt die Software wieder zurück und wartet auf Ihre Eingabe. In der Regel ergibt sich die Auswahl aus den über die Pipe erhaltenen Daten.
|
Option |
Aktion |
Hinweis/Beispiel |
|---|---|---|
|
|
Spaltenmodus |
|
|
|
Überschrift |
|
|
|
Zeilen in Auswahl begrenzen |
|
|
|
Menü zentrieren |
|
|
|
Menü nach Auswahl am Bildschirm löschen |
|
|
|
Auswahl mit mehreren Spalten |
|
|
|
Auswahl mehrspaltig auf voller Terminalbreite |
zusammen mit |
|
|
Mehrfachauswahl zulassen |
|
|
|
Übergebene Zeichenketten aus Auswahl ausschließen |
|
|
|
Nur bezeichnete Zeichenketten zur Auswahl zulassen |
Einsatz im Skript
Um das Ergebnis der Auswahl zu verwenden, setzen Sie die Kommandosubstitution ein, wie Sie sie in der allgemeinen Form in Zeile 1 (aktuelle Syntax) und Zeile 2 (obsolete Syntax) von Listing 1 sehen. Listing 2 und Listing 3 zeigt zwei funktionsfähige Beispiele, deren Einsatz Abbildung 3 verdeutlicht.
Listing 1
VARIABLE=$([KOMMANDO] | smenu) VARIABLE=`[KOMMANDO] | smenu`
Listing 2
#!/bin/sh a=$(echo "1 Erster \n 2 Zweiter \n 3 Dritter \n" | smenu -c) echo "Eingabewert: $a"
Listing 3
#!/bin/sh b=$(ls *.txt | smenu -c) echo "Ausgewählte Datei: $b"

Abbildung 3: Die simplen Skripts aus Listing 1 und**2 demonstrieren, wie einfach Sie mit Smenu ein Menü für Ihre Software erstellen.
Das Listing 2 demonstriert, wie Sie eine Auswahl mit Erläuterungen aufbauen. Als Trennzeichen zwischen den Einträgen dient das Zeilenende-Zeichen (Newline), das Sie als Escape-Sequenz \n einsetzen. Innerhalb eines Eintrags dient das Leerzeichen als Trennzeichen zwischen den Feldern. Das in die Variable übernommene Ergebnis besteht aus dem Wert der ersten Spalte. Smenu invertiert auf dem Bildschirm lediglich den aktuellen Wert der Variablen, nicht aber die vollständige Zeile.
Listing 3 verdeutlicht, wie einfach Sie es Anwendern ermöglichen, interaktiv eine Datei auszuwählen.
Verfeinerungen
Abbildung 4 zeigt ein kleines Menü, das schon über einige zusätzliche Merkmale verfügt. Es gibt einen grünen Scrollbalken, falls die Liste der Einträge eine bestimmte Anzahl an Zeilen erreicht.
Begrenzen Sie die Zahl der sichtbaren Zeilen, etwa mittels -n3 auf drei, so erscheint der Balken, sobald die Länge der Liste diesen Wert überschreitet. Die Überschrift geben Sie durch die Option -m "Text" an. Listing 4 zeigt den entsprechenden Code.
Listing 4
#!/bin/sh clear a=$(ls -1 *.txt | smenu -n3 -c -m "Datei auswählen:") echo "Ausgewählte Datei: $a"
Betrachten Sie den Scrollbalken in der Abbildung 4 genauer: Erreichen Sie den Beginn oder das Ende der Auswahl, erscheint das Winkelzeichen. Die Pfeile zeigen an, dass in der jeweiligen Richtung weitere Einträge existieren.
Benötigen Sie eine Auswahl mit mehreren Spalten, geben Sie deren Anzahl mithilfe der Option -t an (Listing 5). Die Abbildung 5 zeigt das Resultat auf dem Terminalbildschirm. Möchten Sie die Zeileninhalte auf die volle Terminalbreite expandieren, verwenden Sie zusätzlich die Option -w.
Listing 5
#!/bin/sh clear a=$(ls -1 *.txt | smenu -n3 -c -m "Datei auswählen:" -t2) echo "Ausgewählte Datei: $a"
Mehrfache Auswahl
Die Option -T ermöglicht die Auswahl mehrerer Punkte, indem Sie im laufenden Skript für jeden relevanten Punkt [T]+ oder [Einfg]+ drücken. Sie schließen die Auswahl durch [Eingabe]+ ab. Einen markierten Eintrag erkennen Sie daran, dass er unterstrichen erscheint. Durch abermaliges Drücken von [T]+ oder über [Entf] entfernen Sie den Marker wieder.
Die Software verwendet das Leerzeichen als Feldtrenner, sofern Sie nichts anderes angeben. Das Beispiel aus Listing 6 (Abbildung 6) verwendet dagegen den Doppelpunkt. Das ermöglicht es, beim weiteren Verarbeiten des Inhalts der Variablen auf Tools wie Cut zurückzugreifen, um eine Spalte anzusprechen.
Listing 6
#!/bin/sh clear a=$(ls -1 *.txt | smenu -n5 -T: -c -m "Datei(en) auswählen (markieren mit [T]):") echo "Ausgewählte Datei(en): $a"
Vorauswahl im Menü
Gibt es keine Möglichkeit, die Liste der Menüpunkte durch den Befehl in der Pipe zu beschränken, filtern Sie die Daten beim Aufruf von Smenu. Bei Bedarf nutzen Sie dabei reguläre Ausdrücke (Option -e, Listing 7). Alternativ arbeiten Sie mit den positiven Treffern (Option -i, Listing 8).
Listing 7
#!/bin/sh clear a=$(ls -1 | smenu -n5 -c -e [s][h] -m "Datei auswählen: ") echo "Ausgewählte Datei: $a"
Listing 8
#!/bin/sh clear a=$(ls -1 | smenu -n5 -c -i [t][x][t] -m "Datei auswählen: ") echo "Ausgewählte Datei: $a"
Der Effekt ist im Allgemeinen derselbe: Die nicht erwünschten Einträge erscheinen in einer Kombination von Farben, die weniger Kontrast bietet, und lassen sich nicht auswählen (Abbildung 7). Beachten Sie beim Paralleleinsatz beider Optionen, dass die ausschließende eine höhere Priorität aufweist. Dies hat zur Folge, dass Sie gegebenenfalls keine Punkte für die Auswahl erhalten.

Abbildung 7: Falls die als Datenlieferant dienende Software keine Möglichkeit zum Filtern bietet, nutzen Sie die entsprechenden Funktionen von Smenu, um Punkte auszuschließen oder positive Treffer zuzulassen.
PDF-Suche
Mit dem Shell-Skript pdfsuche.sh (Listing 9) durchsuchen Sie einen (durchaus auch großen) Bestand an PDF-Dateien. Mit Smenu zeigt das kleine Programm die Auswahl der Treffer an und ermöglicht darüber hinaus dem Benutzer weitere Aktionen.
Listing 9
#!/bin/bash
# pdfsuche.sh
while true; do
clear
# Suchbegriff eingeben
echo "PDF-Archiv durchsuchen"
echo "----------------------"
read -p "Suchbegriff eingeben (Abbruch: [ENTER] oder [STRG-C]: " sube
if [ -z $sube ]; then
exit
fi
# Aufbau Auswertungsliste, Groß/Kleinschreibung wird ignoriert,
# nur die Anzahl der Treffer wird ausgegeben
for i in $(pdfgrep -H -c -i "$sube" *.pdf); do
trefferzahl=$(echo $i | cut -d\: -f2)
if [ $trefferzahl -gt 0 ]; then
trefferliste=$(echo $trefferliste $i)
fi
done
# Falls Trefferliste leer, neuer Schleifendurchlauf
if [ -z "$trefferliste" ]; then
echo "Keine Treffer"
sleep 3
continue
fi
# Hier kommt Smenu
while true; do
datei=$(echo $trefferliste | tr "\ " "\n" |smenu -d -n20 -c -m "Datei zum Anzeigen auswählen (q für Abbruch):" | cut -d\: -f1)
# Wenn Abbruch mit [q], trefferliste löschen und
# erneuter Schleifendurchlauf
if [ -z $datei ]; then
unset trefferliste
break
fi
# Evince und Qpdfview unterstützen die Übergabe
# eines Suchbegriffs beim Start auf der Shell
evince --find "$sube" $datei
# Weitermachen oder fertig?
weiter=$(echo "Auswahl Fertig" | smenu -d -m "Weiter mit " -s /A)
if [ "$weiter" = "Fertig" ]; then
break
fi
done
done
Das Skript läuft wegen der Option für read in dieser Form nur mit der Bash. Sie vergeben entweder die entsprechenden Rechte, um es direkt auszuführen, oder rufen es in der Form bash pdfsuche.sh auf. Was die PDF-Programme betrifft, lohnt sich ein Blick auf Qpdfview oder Evince: Beide ermöglichen, beim Programmstart die Übergabe eines Suchbegriffs.
Beim Start tippen Sie den Suchbegriff ein (Abbildung 8), den das Skript dann an Pdfgrep übergibt. Das zeigt aber nur die Zahl der Treffer und ignoriert zudem Groß- und Kleinschreibung. Gibt es Treffer, bietet es diese via Smenu zur Auswahl an.

Abbildung 8: Nach der Eingabe des Begriffs startet direkt die Suche und liefert eine Auswahl der Treffer, so es welche gibt.
Haben Sie eine Datei zur Anzeige ausgewählt, reicht das Skript den Suchbegriff auch an den PDF-Betrachter durch. Der hebt ihn dann im Dokument hervor (Abbildung 9). Nach dem Schließen des Anzeigeprogramms nutzen Sie entweder die Auswahl erneut oder geben einen neuen Suchbegriff ein (Abbildung 10).

Abbildung 9: Bestimmte Programme erlauben es, einen Begriff beim Start zu übergeben, den die Software anschließend im Dokument hervorhebt.

Abbildung 10: Nach dem Betrachten eines PDF-Dokuments bietet das Skript die Möglichkeit, eine weitere Datei anzuzeigen oder eine neue Suche zu starten.
Fazit
Das Aufsetzen eines handgestrickten Auswahlmenüs mit den Funktionen der Shell macht relativ viel Arbeit. Hier bietet sich Smenu als praxisorientierte Alternative an. Mit dem flexiblen Tool zaubern Sie ohne größere Verrenkungen mit relativ einfacher Syntax und sehr wenig Code ein Auswahlmenü auf den Bildschirm. Viele Details ermöglichen dabei eine vielseitige Gestaltung.
Der Autor
Harald Zisler beschäftigt sich seit vielen Jahren mit Linux und FreeBSD. Er verfasst Zeitschriftenbeiträge und Bücher zu den Themen Technik und EDV. Aktuell erschien die vierte Auflage von “Computer-Netzwerke” beim Rheinwerk Verlag.








