Je peux comprendre que la complétion automatique bash fonctionne pour les utilitaires standard. Mais comment fait-il la complétion automatique pour des programmes personnalisés comme Oracle SQL Loader?
Dans la commande suivante si vous tabulez après, control=
elle se termine automatiquement au nom du fichier de contrôle:
sqlldr kshitiz/oracle@XE control=data.ctl data=data.csv bad=data.bad log=data.log
Comment sait-il qu'il doit remplir le fichier de contrôle à ce stade et pas un autre fichier?
bash
autocomplete
Kshitiz Sharma
la source
la source
/etc/bash_completion.d
. Voyez également/etc/bash_completion
et regardez la sortie deset
, combien votre environnement a grandi.gdbus-bash-completion.sh
gvfs-bash-completion.sh
pk-completion.bash
yum.bash
. La sortie deset
est tout aussi inintéressante./etc/profile.d
. Ou peut-être que votre.bash_profile
ou a.bashrc
été modifié.bash-completion
charge les achèvements dynamiquement depuis1.90
. Essayez:sqlldr<space><tab><enter>
. Tapez ensuitecomplete -p sqlldr
.Réponses:
L' achèvement programmable de Bash fonctionne en analysant la ligne de commande et en déterminant ce qui est en cours d'achèvement:
$
est complété comme un nom de variable, etc.Par exemple, après , bash termine les noms de commandes commençant par . Après , bash termine les noms de variables commençant par . Après , bash applique les règles d'achèvement de la commande . Les règles d'achèvement peuvent spécifier une catégorie (utilisateur, variable, fichiers, etc.), un modèle générique pour les noms de fichier ou une fonction ou un extrait de code à exécuter.
sqllTab
sqll
sqlldr $aTab
a
sqlldr Tab
sqlldr
Les règles d'achèvement sont définies par la fonction
complete
intégrée. Bash ne garde aucune trace du moment où la commandecomplete
intégrée a été appelée ni du script (le cas échéant) dans lequel elle se trouvait. La plupart des distributions livrent le paquet bash-complètement , qui fournit une série de règles pour les commandes courantes. Cela prend la forme d'une série de fichiers de script qui contiennent des appels àcomplete
, avec un script qui doit être lu.bashrc
(ou/etc/bash.bashrc
s'il est implémenté) pour charger tous ces scripts: il. /etc/bash_completion
est généralement nécessaire pour activer la complétion programmable et charger les scripts disponibles.Le package standard n'inclut pas la prise en charge de
sqlldr
. Si vous disposez d'un tel support, il doit provenir d'une autre source. Cette source peut avoir déposé un fichier dans un répertoire comme/etc/bash_completion.d
ou peut avoir été accompagnée d'instructions pour inclure du code dans votre.bashrc
. Vous pouvez utilisercomplete -p sqlldr
pour voir les règles actuelles poursqlldr
; comme mentionné précédemment, cela ne vous dira pas d'où ces règles ont été chargées.Tcsh, zsh et fish ont des mécanismes quelque peu similaires (tout le monde s'inspire de tcsh) mais des structures, des syntaxes et des capacités différentes.
la source
complete
appel. Mais vous pouvez trouver le nom du fichier source et le numéro de ligne où la fonction d'achèvement est définie.complete -p sudo # outputs complete -F _sudo sudo
,shopt -s extdebug
,declare -F _sudo # outputs _sudo 3 /usr/share/bash-completion/completions/sudo
. (Mais voir mon commentaire sur le chargement dynamique des achèvements etcomplete -p
).and the settings for the basename of the command are applied
. Non. Vous pouvez avoir un compspecs différent pourdate
et/bin/date
. La référence indique : Si le mot de commande est un nom de chemin complet, une spécification du nom de chemin complet est recherchée en premier. Si aucune spécification n'est trouvée pour le chemin d'accès complet, une tentative est faite pour trouver une spécification pour la portion suivant la barre oblique finale