Wortvervollständigung in bash

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
ropri8
Beiträge: 82
Registriert: 22.02.2008 08:37:56

Wortvervollständigung in bash

Beitrag von ropri8 » 11.05.2022 19:05:45

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

Benutzeravatar
Blackbox
Beiträge: 4289
Registriert: 17.09.2008 17:01:20
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Wortvervollständigung in bash

Beitrag von Blackbox » 11.05.2022 20:03:55

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!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Wortvervollständigung in bash

Beitrag von eggy » 11.05.2022 20:20:00

Code: Alles auswählen

complete -W "heute morgen gestern" meinprogramm 
der einfachste Fall wäre das da in die .bashrc zu schreiben.
Oder in eine eigene Datei und dann via source einzubinden.

ropri8
Beiträge: 82
Registriert: 22.02.2008 08:37:56

Re: Wortvervollständigung in bash

Beitrag von ropri8 » 13.05.2022 18:43:24

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

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Wortvervollständigung in bash

Beitrag von JTH » 13.05.2022 18:55:09

ropri8 hat geschrieben: ↑ zum Beitrag ↑
13.05.2022 18:43:24
Tipps werden natürlich gerne angenommen.
Bei solchen Themen immer gerne :D Ich hab allerdings noch nicht ganz verstanden, was du vorhast.

ropri8 hat geschrieben: ↑ zum Beitrag ↑
11.05.2022 19:05:45
Hintergrund: es soll ein Batch für time-trackinig werden.
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?

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.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Wortvervollständigung in bash

Beitrag von eggy » 13.05.2022 19:39:32

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.

Benutzeravatar
oln
Beiträge: 487
Registriert: 05.01.2021 09:41:24

Re: Wortvervollständigung in bash

Beitrag von oln » 20.05.2022 09:55:07

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
Gruß Ole
AbuseIPDB

ropri8
Beiträge: 82
Registriert: 22.02.2008 08:37:56

Re: Wortvervollständigung in bash

Beitrag von ropri8 » 02.10.2022 18:23:35

Hallo!
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
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

Antworten