Ich kann verstehen, dass die automatische Vervollständigung von Bash für Standarddienstprogramme funktioniert. Aber wie erfolgt die automatische Vervollständigung für benutzerdefinierte Programme wie Oracle SQL Loader?
Wenn Sie im folgenden Befehl die Tabulatortaste control=
drücken, wird der Name der Steuerdatei automatisch vervollständigt:
sqlldr kshitiz/oracle@XE control=data.ctl data=data.csv bad=data.bad log=data.log
Woher weiß es, dass es zu diesem Zeitpunkt die Steuerdatei ausfüllen muss und keine andere Datei?
bash
autocomplete
Kshitiz Sharma
quelle
quelle
/etc/bash_completion.d
. Sehen Sie auch/etc/bash_completion
und sehen Sie sich anset
, wie stark Ihre Umgebung gewachsen ist.gdbus-bash-completion.sh
gvfs-bash-completion.sh
pk-completion.bash
yum.bash
. Die Ausgabe vonset
ist ebenso uninteressant./etc/profile.d
. Oder vielleicht dein.bash_profile
oder.bashrc
wurde modifiziert.bash-completion
lädt Vervollständigungen seitdem dynamisch1.90
. Versuchen Sie :sqlldr<space><tab><enter>
. Geben Sie dann eincomplete -p sqlldr
.Antworten:
Bashs programmierbare Fertigstellung funktioniert, indem die Befehlszeile analysiert und herausgefunden wird, was abgeschlossen wird:
$
wird als Variablenname vervollständigt usw.Beispielsweise vervollständigt bash nachher Befehlsnamen, die mit beginnen . Danach vervollständigt bash Variablennamen, die mit beginnen . Danach wendet bash die Abschlussregeln für den Befehl an . Abschlussregeln können eine Kategorie (Benutzer, Variable, Dateien usw.), ein Platzhaltermuster für Dateinamen oder ein auszuführendes Funktions- oder Codefragment angeben.
sqllTab
sqll
sqlldr $aTab
a
sqlldr Tab
sqlldr
Abschlussregeln werden durch das
complete
eingebaute definiert . Bash verfolgt nicht, wann dascomplete
eingebaute System aufgerufen wurde oder in welchem Skript (falls vorhanden) es sich befand. Die meisten Distributionen liefern das Bash-Completion- Paket, das eine Reihe von Regeln für allgemeine Befehle enthält. Dies erfolgt in Form einer Reihe von Skriptdateien, die Aufrufe an enthaltencomplete
, mit einem Skript, aus dem gelesen werden muss.bashrc
(oder das/etc/bash.bashrc
implementiert wird), um alle diese Skripte zu laden. Dies wird normalerweise. /etc/bash_completion
benötigt, um die programmierbare Fertigstellung zu aktivieren und die verfügbaren Skripte zu laden.Das Standardpaket enthält keine Unterstützung für
sqlldr
. Wenn Sie eine solche Unterstützung haben, muss diese von einer anderen Quelle stammen. Diese Quelle hat möglicherweise eine Datei in einem Verzeichnis wie gelöscht/etc/bash_completion.d
oder Anweisungen zum Einfügen von Code in Ihr Verzeichnis geliefert.bashrc
. Sie können verwendencomplete -p sqlldr
, um die aktuellen Regeln für anzuzeigensqlldr
; Wie bereits erwähnt, können Sie hier nicht feststellen, woher diese Regeln geladen wurden.Tcsh, zsh und fish haben ähnliche Mechanismen (jeder hat sich von tcsh inspirieren lassen), aber unterschiedliche integrierte Funktionen, Syntaxen und Funktionen.
quelle
complete
angerufen wurde. Sie können jedoch den Namen und die Zeilennummer der Quelldatei finden, in der die Abschlussfunktion definiert ist.complete -p sudo # outputs complete -F _sudo sudo
,shopt -s extdebug
,declare -F _sudo # outputs _sudo 3 /usr/share/bash-completion/completions/sudo
. (Aber siehe meinen Kommentar zum dynamischen Laden von Abschlüssen undcomplete -p
).and the settings for the basename of the command are applied
. Nein. Sie können eine andere Compspecs fürdate
und haben/bin/date
. Die Referenz lautet : Wenn das Befehlswort ein vollständiger Pfadname ist, wird zuerst nach einer Compspec für den vollständigen Pfadnamen gesucht. Wenn für den vollständigen Pfadnamen keine Compspec gefunden wird, wird versucht, eine Compspec für den Teil nach dem letzten Schrägstrich zu finden