Frage Standardplatz für benutzerdefinierte bash_completion.d-Skripte?


Ich habe Benutzerzugriff (keine root) auf eine Linux (Suse) Maschine, wo ich einige Bash-Skripte und die entsprechenden bash-Autokomplettierungsregeln entwickelt habe.

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

Im Moment habe ich meine Datei benannt .bash_completion.myscript und es direkt von meiner Quelle beziehen .bashrc, aber ich frage mich nur, ob es andere "Standard" -Methoden gibt, diese Ergebnisse zu erreichen, die bereits in der Bash-Implementierung berücksichtigt wurden.

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


34
2018-05-10 08:25


Ursprung




Antworten:


Verwenden ein ~/.bash_completion Datei.

Von dem Bash Completion FAQ:

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

A. Setzen Sie sie in ~ / .bash_completion, die am Ende der analysiert wird
  Hauptabschluss-Skript. Siehe auch die nächste Frage.

F. Ich erstelle / pflege Paket X und möchte mein eigenes pflegen
  Abschlusscode für dieses Paket. Wo soll ich es hinstellen?
  dass interaktive Bash-Shells es finden und beschaffen?

A. Installieren Sie es in einem der Verzeichnisse, auf die verwiesen wird
  die pkgconfig-Dateivariablen von bash-completion. Es gibt zwei
  Alternativen: die empfohlene ist 'completionsdir' (mit
  "pkg-config --variable = completionsdir bash-completion") von dem
  Vervollständigungen werden bei Bedarf geladen, basierend auf den Namen der aufgerufenen Befehle.
  Achten Sie also darauf, Ihre Abschlussdatei entsprechend zu benennen und einzuschließen
  zum Beispiel symbolische Links für den Fall, dass die Datei Vervollständigungen bereitstellt
  für mehr als einen Befehl. Der andere, der anwesend ist für
  Rückwärtskompatibilitätsgründe sind 'comptdir' (erhalten Sie mit
  "pkg-config --variable = compatdir bash-completion") aus welchen Dateien
  werden geladen, wenn bash_completion geladen ist.


26
2018-05-10 14:18



Ich habe viel in serverfault gegoogelt und gesucht, bevor ich gefragt habe, aber ich habe nicht über den grundlegendsten Schritt nachgedacht: RTFM! Vielen Dank für die Antwort! - Carles Sala
Vielleicht möchte ich das angeben .bash_completion ist eine Datei und kein Verzeichnis. Schon seit bash_completion.d ist ein Verzeichnis, von dem ich annahm, ich könnte es einfach scp mein Einheimischer bash_completion.d und benenne es auf dem entfernten Server um, aber beim nächsten Login sagte es mir, dass es eine Datei sein musste. - NobleUplift
@NobleUplift: Fertig. Vielen Dank. - Dennis Williamson


Hier ist, wie ein lokaler Benutzer arbeiten kann ~/.bash_completion.d/ Verzeichnis.

  1. Datei bearbeiten: nano ~/.bash_completion, füge folgendes hinzu:

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

  3. Datei bearbeiten: ~/.bash_completion.d/myscript, füge 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 du erwartest, dass du leer bist ~/.bash_completion.d/ Verzeichnis und möchten vermeiden, die Fehlermeldung zu sehen bash: /home/<username>/.bash_completion.d/*: No such file or directory, fügen Sie einen Dateityptest mit hinzu [ -f "$bcfile" ].

for bcfile in ~/.bash_completion.d/* ; do
  [ -f "$bcfile" ] && . $bcfile
done

35
2018-02-07 20:57





Das Antwort von Russell E Glaue ist großartig, aber es ist ~/.bash_completion ist unvollständig.

Das Problem ist, wann ~/.bash_completion.d/ ist leer und anschließend for f in ~/.bash_completion.d/* gibt folgende Fehlermeldung aus:

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

Die einfachste, portable 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

1
2018-04-20 16:52





Eine einfachere Lösung ist die Verwendung der Option nullglob. Dies ist zwar nicht übertragbar, aber auch keine Bash-Vervollständigungen. Portabilität ist also egal.

Außerdem sollten Sie bei der Suche Zitate um die Variable herum verwenden. Dies behandelt den Fall, in dem die Datei Leerzeichen und andere Sonderzeichen enthält.

shopt -s nullglob

for f in ~/.bash_completion.d/*; do
  [ -f "$f" ] && . "$f"
done

0
2018-06-07 12:32