Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

TLDR; bash completion

2 views
Skip to first unread message

Markus Schaaf

unread,
Apr 2, 2020, 2:31:21 PM4/2/20
to
Hallo,

ich schreibe mir öfter kleine Tools für eher esoterische Aufgaben. Dabei
verwende ich meist den Stil von dd für Kommmandozeilen-Parameter, so
ähnlich wie:

$ tool afile=/tmp/testa foosz=1024

Nun will ich nicht für jedes Programm eigene bash-completions
installieren. Ich hätte gerne, dass bash generell jedes Argument, das
mit ${foo}file= anfängt, als Dateinamen vervollständigt. Kann mir jemand
ein schnelles Rezept dafür nennen?

MfG

Stefan Reuther

unread,
Apr 3, 2020, 11:45:12 AM4/3/20
to
Am 02.04.2020 um 20:31 schrieb Markus Schaaf:
> Nun will ich nicht für jedes Programm eigene bash-completions
> installieren. Ich hätte gerne, dass bash generell jedes Argument, das
> mit ${foo}file= anfängt, als Dateinamen vervollständigt. Kann mir jemand
> ein schnelles Rezept dafür nennen?

Ich benutze gar keine bash-completions, da ist das die
Standardeinstellung, schon, damit man bei "PATH=/usr" oder "make
PREFIX=/opt" Completion hat. Insofern würde ich behaupten, dass da
irgendeine Standardregel konfiguriert ist, die *ab*geschaltet werden muss.


Stefan

Markus Schaaf

unread,
Apr 4, 2020, 8:02:25 AM4/4/20
to
On 03.04.20 17:37, Stefan Reuther wrote:

> Ich benutze gar keine bash-completions, da ist das die
> Standardeinstellung, schon, damit man bei "PATH=/usr" oder "make
> PREFIX=/opt" Completion hat. Insofern würde ich behaupten, dass da
> irgendeine Standardregel konfiguriert ist, die *ab*geschaltet werden muss.

Ich habe mich jetzt doch durch /usr/share/bash-completion/ gelesen und
nun leichte Kopfschmerzen. Ich glaube nicht, dass Du keine
bash-completion installiert hast. PATH=/ macht bash intern, aber make
BLA=/ braucht etwas Magie. Ich habe auch die Stelle mit der
Default-Regel gefunden. Ist jedoch nicht hilfreich.

MfG

Markus Schaaf

unread,
Apr 4, 2020, 1:57:43 PM4/4/20
to
On 04.04.20 14:02, Markus Schaaf wrote:

> Ich habe auch die Stelle mit der
> Default-Regel gefunden. Ist jedoch nicht hilfreich.

Was ich meine: Der Tipp war richtig. Nur gibt es keine gute
Eingriffsmöglichkeit, ohne die Interna des Pakets bash-completion zu
kennen. Wenn man das zu plump in seine .bashrc einbaut, macht man alle
Paket-spezifischen Completions kaputt.

MfG

Stefan Reuther

unread,
Apr 5, 2020, 5:19:30 AM4/5/20
to
Am 04.04.2020 um 14:02 schrieb Markus Schaaf:
> On 03.04.20 17:37, Stefan Reuther wrote:
>> Ich benutze gar keine bash-completions, da ist das die
>> Standardeinstellung, schon, damit man bei "PATH=/usr" oder "make
>> PREFIX=/opt" Completion hat. Insofern würde ich behaupten, dass da
>> irgendeine Standardregel konfiguriert ist, die *ab*geschaltet werden muss.
>
> Ich habe mich jetzt doch durch /usr/share/bash-completion/ gelesen und
> nun leichte Kopfschmerzen. Ich glaube nicht, dass Du keine
> bash-completion installiert hast.

Installiert ja, aber nicht aktiv. Ich habe halt - nachdem ich mehr
dagegen gekämpft habe als Gewinn daraus gezogen - den Block, der die
Completions aktiviert, aus der bashrc entfernt. Was nutzt es mir, wenn
ich das 'diff' in 'cvs diff' komplettieren kann (was nicht nötig ist, da
'cvs' auch mit 'di' zufrieden ist), aber den dahinterstehenden
Dateinamen nicht?

> PATH=/ macht bash intern, aber make BLA=/ braucht etwas Magie.

Wie gesagt, das ist die Defaultregel wenn gar keine Completion aktiv
ist. Mal damit rumgespielt:

complete make true
make BLA=/<tab> # keine Reaktion
complete -r make
make BLA=/<tab> # bin/ dev/ etc/ home/ lib/ ...

Und das gleiche mit der Defaultregel

complete -D true
ls /<tab> # keine Reaktion
make BLA=/<tab> # keine Reaktion
complete -rD
ls /<tab> # bin/ dev/ etc/ home/ lib/ ...
make BLA=/<tab> # bin/ dev/ etc/ home/ lib/ ...

Insofern würde ich konstatieren: ein 'complete -rD' ans Ende der
Nutzer-bashrc geschrieben (hinter die Stelle, wo '/etc/bash_completion'
usw. geladen werden) sollte für unbekannte Kommandos das
Standardverhalten wiederherstellen, wo nach einem '=' ein Dateiname
akzeptiert wird.


Stefan

Markus Schaaf

unread,
Apr 6, 2020, 11:37:08 AM4/6/20
to
Am 05.04.20 um 10:39 schrieb Stefan Reuther:

> Insofern würde ich konstatieren: ein 'complete -rD' ans Ende der
> Nutzer-bashrc geschrieben (hinter die Stelle, wo '/etc/bash_completion'
> usw. geladen werden) sollte für unbekannte Kommandos das
> Standardverhalten wiederherstellen, wo nach einem '=' ein Dateiname
> akzeptiert wird.

Deswegen schrieb ich "nicht hilfreich". Das Paket bash-completion läd
fast alles mit der Default-Regel nach. Und auf einige Sachen möchte ich
nicht verzichten. Es ist "im Prinzip" recht leicht, das Problem zu lösen:

aus /usr/share/bash-completion/bash_completion :
---
# set up dynamic completion loading
_completion_loader()
{
# $1=_EmptycmD_ already for empty cmds in bash 4.3, set to it for
earlier
local cmd="${1:-_EmptycmD_}"

__load_completion "$cmd" && return 124

# Need to define *something*, otherwise there will be no completion
at all.
complete -F _minimal -- "$cmd" && return 124
} &&
complete -D -F _completion_loader
---

Indem man obige Funktion ersetzt. Ich habe mich dann aber entschieden,
den Completion-Kram ins Programm einzubauen und ein minimales Drop-In
für bash-completion zu installieren.

Danke & MfG
0 new messages