Standardspeicherort für benutzerdefinierte bash_completion.d-Skripte?

47

Ich habe Benutzerzugriff (kein Root) auf einen Linux-Computer (Suse), auf dem ich einige Bash-Skripte und die entsprechenden Regeln für die automatische Vervollständigung von Bashs entwickelt habe.

Da die Skripte nur meinem Benutzer gehören und ich daher die vollständigen Regeln nur "aktiv" für mich brauche (ein Teil der Tatsache, dass ich keinen Root-Schreibzugriff habe), /etc/bash_completion.d/ist es keine Option , mein bash_completion-Skript in einem Ordner abzulegen .

Im Moment habe ich meine Datei benannt .bash_completion.myscriptund sie direkt von meiner Quelle bezogen .bashrc, aber ich frage mich nur, ob es einen anderen "Standard" Weg gibt, um diese Ergebnisse zu erzielen, der bereits in der Bash-Implementierung berücksichtigt wurde.

Zum Beispiel einen Ordner erstellen /home/myuser/.bash_completion.d/?

Carles Sala
quelle

Antworten:

36

Verwenden Sie eine ~/.bash_completionDatei.

Aus der Bash Completion FAQ :


Frage: Wie kann ich meine eigenen lokalen Vervollständigungen einfügen, ohne sie jedes Mal neu einfügen zu müssen, wenn Sie eine neue Version herausgeben?

A. Fügen Sie sie in ~ / .bash_completion ein, das am Ende des
Hauptabschlussskripts analysiert wird . Siehe auch die nächste Frage.

F. Ich verfasse / pflege Paket X und möchte meinen eigenen
Beendigungscode für dieses Paket pflegen . Wo soll ich es hinstellen
, um sicherzustellen, dass interaktive Bash-Shells es finden und als Quelle verwenden können?

A. Installieren Sie es in einem der Verzeichnisse, auf die
die pkgconfig-Dateivariablen von bash-completion verweisen. Es gibt zwei
Alternativen: Die empfohlene ist 'completionsdir' (erhalten Sie mit
"pkg-config --variable = completionsdir bash-completion"), von der die
Vervollständigungen auf Anfrage basierend auf den Namen der aufgerufenen Befehle geladen
werden Vervollständigungsdatei entsprechend und
um beispielsweise symbolische Links einzuschließen, falls die Datei Vervollständigungen
für mehr als einen Befehl bereitstellt . Das andere, das aus
Gründen der Abwärtskompatibilität vorhanden ist, ist 'compatdir' (holen Sie es sich mit
"pkg-config --variable = compatdir bash-completion"

Dennis Williamson
quelle
Ich habe viel in serverfault gegoogelt und gesucht, bevor ich gefragt habe, aber nicht über den grundlegendsten Schritt nachgedacht: RTFM! Vielen Dank für die Rückmeldung!
Carles Sala
4
Möglicherweise möchten Sie angeben, dass .bash_completiones sich um eine Datei und nicht um ein Verzeichnis handelt. Da bash_completion.des sich um ein Verzeichnis handelt, ging ich davon aus, dass ich nur scpmein lokales Verzeichnis bash_completion.dauf dem Remote-Server umbenennen und es beim nächsten Anmelden als Datei angeben könnte.
NobleUplift
3
Die häufig gestellten Fragen zur Bash-Vervollständigung in @NobleUplift wurden geändert und enthalten nun Informationen zum Laden der Bash-Vervollständigungen des Benutzers aus einem Verzeichnis nach Bedarf. Dies scheint zumindest mit der Bash-Completion-Version 2.8 zu funktionieren, jedoch nicht mit der Version 2.1. Die Dateien im Verzeichnis sollten genauso benannt sein wie der Befehl, für den sie bestimmt sind, oder es können symbolische Links für diesen Zweck verwendet werden.
Jarno
@jarno Ich habe Bash-Completion-Skripte für alle benutzerdefinierten Programme und Skripte in unserem System codiert, aber meine leitenden Entwickler haben sie abgeschossen :(
NobleUplift
@ NobleUplift warum? Sie können sie trotzdem für sich nutzen.
26.
49

So kann ein lokaler Benutzer ein Arbeitsverzeichnis haben ~/.bash_completion.d/.

  1. Datei bearbeiten:, nano ~/.bash_completionfügen Sie Folgendes hinzu:

    for bcfile in ~/.bash_completion.d/* ; do
      . $bcfile
    done
  2. Verzeichnis erstellen: mkdir ~/.bash_completion.d

  3. Datei bearbeiten:, ~/.bash_completion.d/myscriptfügen Sie Folgendes hinzu:

    _myscript_tab_complete () {
        local cur prev opts
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        words="-f -h --etc"
    
        COMPREPLY=( $(compgen -W "${words}" -- ${cur}) )
        return 0
    }
    complete -F _myscript_tab_complete myscript
  4. Quelle .bash_completion: . ~/.bash_completion

Aktualisieren

Wenn Sie ein leeres ~/.bash_completion.d/Verzeichnis erwarten und die Fehlermeldung nicht sehen möchten bash: /home/<username>/.bash_completion.d/*: No such file or directory, fügen Sie einen Dateityp-Test mit hinzu [ -f "$bcfile" ].

for bcfile in ~/.bash_completion.d/* ; do
  [ -f "$bcfile" ] && . $bcfile
done
Russell E Glaue
quelle
2

Die Antwort von Russell E Glaue ist großartig, aber ~/.bash_completionunvollständig.

Das Problem ist, wenn ~/.bash_completion.d/leer ist und anschließend for f in ~/.bash_completion.d/*die folgende Fehlermeldung ausgegeben wird:

-bash: /home/user/.bash_completion.d/*: Keine solche Datei oder kein solches Verzeichnis

Die einfachste, tragbare Lösung besteht darin, die Schleife zu überspringen, wenn das Verzeichnis leer ist:

if [[ -d ~/.bash_completion.d/ ]] && \
   ! find ~/.bash_completion.d/. ! -name . -prune -exec false {} +
then
    for f in ~/.bash_completion.d/*
    do
        source "$f"
    done
fi
Mateusz Piotrowski
quelle
1

Eine einfachere Lösung ist die Verwendung der Option nullglob. Dies ist zwar nicht portierbar, aber es gibt auch keine Bash-Vervollständigungen. Portabilität spielt also keine Rolle.

Außerdem sollten Sie beim Sourcing Anführungszeichen um die Variable verwenden. Dies behandelt den Fall, dass die Datei Leerzeichen anderer Sonderzeichen enthält.

shopt -s nullglob

for f in ~/.bash_completion.d/*; do
  [ -f "$f" ] && . "$f"
done
npmccallum
quelle
1
Zu Ihrer Information, eine Erklärung (oder ein Link zu Dokumenten) zu etwas, das gezeigt wird (dh nullglob), ist für den Leser hilfreich.
Cometsong
1

Mindestens Bash-Vervollständigung 2.8 und höher aktivieren die Option, lokale Bash-Vervollständigungen im Verzeichnis abzulegen

${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions

Die Namen der Vervollständigungsdateien oder symbolischen Verknüpfungen müssen mit den jeweiligen Befehlsnamen übereinstimmen. Diese Vervollständigungen werden nur bei Bedarf geladen. In der Datei gespeicherte Vervollständigungen werden ~/.bash_completionimmer geladen.

Referenz: Siehe "F. Wo sollte ich meine eigenen lokalen Ergänzungen installieren?" in https://github.com/scop/bash-completion/blob/master/README.md

jarno
quelle