Wortvervollständigung in bash
Wortvervollständigung in bash
Hallo!
In der bash gibt es ja die Pfadvervollständigung mittels <TAB>-Taste. Ich suche nun so was ähnliches, nur dass die Wörter aus einer Datei stammen, (welche zuvor eingelesen wird) und deren Name dann bei der Eingabe vervollständigt werden soll. Geht das? Hintergrund: es soll ein Batch für time-trackinig werden. Die Projekte (Wörter) werden aus einer sqlite-DB abgefragt und temporär in eine Datei geschrieben. Aus dieser stammen dann die Daten, die vervollständigt werden sollen.
Gruß, Roman
In der bash gibt es ja die Pfadvervollständigung mittels <TAB>-Taste. Ich suche nun so was ähnliches, nur dass die Wörter aus einer Datei stammen, (welche zuvor eingelesen wird) und deren Name dann bei der Eingabe vervollständigt werden soll. Geht das? Hintergrund: es soll ein Batch für time-trackinig werden. Die Projekte (Wörter) werden aus einer sqlite-DB abgefragt und temporär in eine Datei geschrieben. Aus dieser stammen dann die Daten, die vervollständigt werden sollen.
Gruß, Roman
- Blackbox
- Beiträge: 4289
- Registriert: 17.09.2008 17:01:20
- Lizenz eigener Beiträge: GNU Free Documentation License
Re: Wortvervollständigung in bash
Mich würde erst einmal interessieren, was das Ziel dieser Übung werden soll?
Eigenbau PC: Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Desktop PC: Dell Inspiron 530 - Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Notebook: TUXEDO BU1406 - Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Alles Minimalinstallationen und ohne sudo/PA/PW.
Rootserver: Rocky Linux 9.3 - Kernel: 5.14
Freie Software unterstützen, Grundrechte stärken!
Desktop PC: Dell Inspiron 530 - Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Notebook: TUXEDO BU1406 - Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Alles Minimalinstallationen und ohne sudo/PA/PW.
Rootserver: Rocky Linux 9.3 - Kernel: 5.14
Freie Software unterstützen, Grundrechte stärken!
Re: Wortvervollständigung in bash
Code: Alles auswählen
complete -W "heute morgen gestern" meinprogramm
Oder in eine eigene Datei und dann via source einzubinden.
Re: Wortvervollständigung in bash
Hallo!
@eggy: danke für den Tipp - wusste nicht, das selbst die bash-completion derartige Möglichkeiten bietet. Ist im Prinzip genau dass, was ich suche.
Ich hab' nur noch ein Henne-Ei Problem: Der Batch, den ich mit bash-completion aufrufen will muss zuerst in der Datenbank nachschauen, um die Liste für die bash-completion zu erstellen. Daher kann er beim Aufruf noch nicht vervollständigen .... aber dass ist sozusagen eine andere Geschichte ... vielleicht fällt mir ja noch eine Lösung ein. Tipps werden natürlich gerne angenommen.
Gruß,
Roman
@eggy: danke für den Tipp - wusste nicht, das selbst die bash-completion derartige Möglichkeiten bietet. Ist im Prinzip genau dass, was ich suche.
Ich hab' nur noch ein Henne-Ei Problem: Der Batch, den ich mit bash-completion aufrufen will muss zuerst in der Datenbank nachschauen, um die Liste für die bash-completion zu erstellen. Daher kann er beim Aufruf noch nicht vervollständigen .... aber dass ist sozusagen eine andere Geschichte ... vielleicht fällt mir ja noch eine Lösung ein. Tipps werden natürlich gerne angenommen.
Gruß,
Roman
Re: Wortvervollständigung in bash
Bei solchen Themen immer gerne

Was meint das? Batch ist eher ein Windows-Begriff – meinst du womöglich ein Shellskript, das du wie eine Anwendung für Time-Tracking benutzen und dafür aufrufen möchtest?ropri8 hat geschrieben:11.05.2022 19:05:45Hintergrund: es soll ein Batch für time-trackinig werden.
Wenn ja, wäre die (Bash-) Completion tatsächlich ein Ansatz. eggy hat da nur die allergrundlegenste Möglichkeit angedeutet, mit einer fix feststehenden Wortliste und ohne das Gerüst drumherum. Wenn du dir angucken willst, was da alles möglich ist, guck dich mal in /usr/share/bash-completion/completions um. Das sind die Vervollständigungsskripte, die – in der Bash zumindest – dahinterstecken, wenn du hinter einer Konsolenanwendung TAB drückst. Da ist einiges möglich, auch eine temporäre Verbindung zu einer Datenbank ist absolut denkbar. /usr/share/bash-completion/bash_completion ist ein dazugehöriges Skript, das viele Helferlein enthält und von den vorigen erwähnten benutzt wird. Es geht allerdings, mit evtl. etwas mehr Handarbeit, auch ohne das.
Manchmal bekannt als Just (another) Terminal Hacker.
Re: Wortvervollständigung in bash
Du könntest ein Script erstellen, dass die Anfrage zusammenbaut.
echo "complete -W \"" > projekte.sh
sqlanfrage >> projekte.sh
echo "\"" >> projekte.sh
Die projekte.sh könntest du dann in der .bashrc einbinden
"source projekte.sh" bzw ". projekte.sh".
Je nachdem wie häufig sich da was ändert und wie lange Deine Datenbankanfrage braucht, kannst du das Erstellen z.B. via cronjob, manuell oder bei Aufruf der .bashrc machen. Letzteres ist eher unpraktisch, weil man viel häufiger neue Terminals aufmacht, als man denkt.
echo "complete -W \"" > projekte.sh
sqlanfrage >> projekte.sh
echo "\"" >> projekte.sh
Die projekte.sh könntest du dann in der .bashrc einbinden
"source projekte.sh" bzw ". projekte.sh".
Je nachdem wie häufig sich da was ändert und wie lange Deine Datenbankanfrage braucht, kannst du das Erstellen z.B. via cronjob, manuell oder bei Aufruf der .bashrc machen. Letzteres ist eher unpraktisch, weil man viel häufiger neue Terminals aufmacht, als man denkt.
Re: Wortvervollständigung in bash
Moin,
ich habe mal ettwas ähnliches gemacht. Dabei hat mir diese Seite den richtigen Einstieg gegeben:
https://opensource.com/article/18/3/cre ... ion-script
ich habe mal ettwas ähnliches gemacht. Dabei hat mir diese Seite den richtigen Einstieg gegeben:
https://opensource.com/article/18/3/cre ... ion-script
Gruß Ole
AbuseIPDB
AbuseIPDB
Re: Wortvervollständigung in bash
Hallo!
Sorry, hat etwas länger gedauert, aber jetzt hab' ich es hinbekommen - mit einer dynamischen Vervollständigung in der bash:
Es geschieht folgendes:
Beim Aufruf des Shell-Scriptes ./tl wird für genau diesen Befehl die (benutzerdefinierte) Vervollständigung angefordert. Diese extrahiert zuerst aus der Datenbank timelog.db die verfügbaren Projektnamen und daraus wird dann in der if-Schleife die Vervollständigung generiert.
Ohne Hilfe wäre es nicht gegangen:
1.) der Link von Ole
2.) Tolles Erklärungsvideo gefunden: https://www.youtube.com/watch?v=CPjOLq2FjsQ
Danke!
Gruß, Roman
Sorry, hat etwas länger gedauert, aber jetzt hab' ich es hinbekommen - mit einer dynamischen Vervollständigung in der bash:
Code: Alles auswählen
#!/bin/bash
_tl_completions(){
local VERFUEGBARE_PROJEKTE=$(echo $(sqlite3 timelog.db "SELECT project_name FROM 'tl_projects'"))
# String mit allen verfügbaren Projektnamen erzeugen (aus DB extrahieren)
COMPREPLY=()
# Array-Variable COMPREPLY setzten (= jene Variable, von welcher die Bash die möglichen Vervollständigungen liest
if [ "$COMP_CWORD" -eq 1 ] ; then
# Wenn Curser auf Index-Position 1 ist
local CURRENT_WORD=${COMP_WORDS[1]}
# Variable CURRENT_WORD mit dem Inhalt von Array-Index 1 belegen
COMPREPLY=($(compgen -W "$VERFUEGBARE_PROJEKTE" -- $CURRENT_WORD))
# mittels compgen aus dem String VERFUEGBARE_PROJEKTE die zu CURRENT_WORD passende Vervollständigung generieren
fi
}
complete -F _tl_completions ./tl
Beim Aufruf des Shell-Scriptes ./tl wird für genau diesen Befehl die (benutzerdefinierte) Vervollständigung angefordert. Diese extrahiert zuerst aus der Datenbank timelog.db die verfügbaren Projektnamen und daraus wird dann in der if-Schleife die Vervollständigung generiert.
Ohne Hilfe wäre es nicht gegangen:
1.) der Link von Ole
2.) Tolles Erklärungsvideo gefunden: https://www.youtube.com/watch?v=CPjOLq2FjsQ
Danke!
Gruß, Roman