Wie kann eine benutzerdefinierte automatische Vervollständigung für bestimmte Befehle angegeben werden?

25

Gibt es eine Möglichkeit, Bash genau wissen zu lassen, was angezeigt werden soll, wenn Sie doppelte Tabs ausführen? Zum Beispiel habe ich ein Python-Skript, scpydas ein paar Argumente erfordert. Zum Beispiel apt-get, wenn Sie doppelte Registerkarte gibt

Autoclean Build-Dep Clean Dselect-Upgrade Purge Source Upgrade
autoremove check dist-upgrade installiere remove update  

Gibt es eine Möglichkeit, dies für Ihre eigenen Skripte / Programme zu tun? Muss ich mein Python-Skript in ein Bash-Skript einbinden?

Falmarri
quelle

Antworten:

31

Am einfachsten geht das, indem Sie ein Shell-Skript in das Skript einfügen /etc/bash_completion.d/. Die Grundstruktur dieser Datei ist eine einfache Funktion, die die Vervollständigung durchführt und deren Aufruf completeeine eingebaute Bash ist. completeIch empfehle Ihnen, eine Einführung in die Bash-Vervollständigung zu lesen , anstatt detailliert auf die Verwendung einzugehen . Teil 1 behandelt die Grundlagen und Teil 2 erklärt, wie Sie ein Abschlussskript schreiben.

Eine ausführlichere Beschreibung der Bash-Vervollständigung finden Sie im Abschnitt "Programmierbare Vervollständigung" von man bash(Sie können "/ Programmable Completion" eingeben und dann ein paar Mal "n" drücken, um schnell dorthin zu gelangen. Wenn Sie Glück haben, "g 2140 RETURN ").

Steven D
quelle
8

Hier ist eine grundlegende Anleitung.

Nehmen wir ein Beispiel für ein Skript mit dem Namen admin.sh, an dem die automatische Vervollständigung ausgeführt werden soll.

#!/bin/bash

while [ $# -gt 0 ]; do
  arg=$1
  case $arg in
    option_1)
     # do_option_1
    ;;
    option_2)
     # do_option_1
    ;;
    shortlist)
      echo option_1 option_2 shortlist
    ;;
    *)
     echo Wrong option
    ;;
  esac
  shift
done

Optionsauswahlliste beachten. Wenn Sie das Skript mit dieser Option aufrufen, werden alle möglichen Optionen für dieses Skript ausgedruckt.

Und hier haben Sie das Autocomplete-Skript:

_script()
{
  _script_commands=$(/path/to/your/script.sh shortlist)

  local cur prev
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )

  return 0
}
complete -o nospace -F _script ./admin.sh

Beachten Sie, dass das letzte zu vervollständigende Argument der Name des Skripts ist, zu dem Sie die automatische Vervollständigung hinzufügen möchten. Alles was Sie tun müssen, ist Ihr Autocomplete-Skript zu bashrc as hinzuzufügen

source /path/to/your/autocomplete.sh

oder kopieren Sie es nach /etc/bash.completion.d

Quelle: /ubuntu//a/483149/24155

Eduardo Cuomo
quelle
3
'komplettes Tutorial' ist nicht der Ausdruck, den ich verwenden würde, um dies zu beschreiben ...
Suchmaschine27