Puedo entender que bash auto complete funciona para las utilidades estándar. Pero, ¿cómo funciona la finalización automática para programas personalizados como Oracle SQL Loader?
En el siguiente comando si tabula después control=
, se completa automáticamente con el nombre del archivo de control:
sqlldr kshitiz/oracle@XE control=data.ctl data=data.csv bad=data.bad log=data.log
¿Cómo sabe que tiene que completar el archivo de control en ese punto y no otro archivo?
bash
autocomplete
Kshitiz Sharma
fuente
fuente
/etc/bash_completion.d
. Vea también/etc/bash_completion
y eche un vistazo a la producción deset
cuánto ha crecido su entorno.gdbus-bash-completion.sh
gvfs-bash-completion.sh
pk-completion.bash
yum.bash
. La salida deset
es igual de interesante./etc/profile.d
. O tal vez tu.bash_profile
o.bashrc
fue modificado.bash-completion
carga las terminaciones dinámicamente desde entonces1.90
. Proveedores:sqlldr<space><tab><enter>
. Luego escribecomplete -p sqlldr
.Respuestas:
La finalización programable de Bash funciona analizando la línea de comando y descubriendo lo que se está completando:
$
se completa como un nombre de variable, etc.Por ejemplo, después , bash completa los nombres de comando que comienzan con . Después , bash completa los nombres de variables que comienzan con . Después , bash aplica las reglas de finalización para el comando . Las reglas de finalización pueden especificar una categoría (usuario, variable, archivos, etc.), un patrón comodín para los nombres de archivo o una función o fragmento de código para ejecutar.
sqllTab
sqll
sqlldr $aTab
a
sqlldr Tab
sqlldr
Las reglas de finalización están definidas por el
complete
incorporado. Bash no realiza un seguimiento de cuándocomplete
se llamó al builtin o de qué script (si corresponde) estaba. La mayoría de las distribuciones envían el paquete bash-complete , que proporciona una serie de reglas para comandos comunes. Esto toma la forma de una serie de archivos de script que contienen llamadas acomplete
, con un script que debe leerse.bashrc
(o/etc/bash.bashrc
si está implementado) para cargar todos estos scripts: generalmente. /etc/bash_completion
es necesario para activar la finalización programable y cargar los scripts disponibles.El paquete estándar no incluye soporte para
sqlldr
. Si tiene dicho soporte, debe provenir de una fuente diferente. Es posible que esta fuente haya dejado caer un archivo en un directorio similar/etc/bash_completion.d
o que haya venido con instrucciones para incluir algún código en su.bashrc
. Puede usarcomplete -p sqlldr
para ver las reglas actuales parasqlldr
; como se mencionó anteriormente, esto no le dirá de dónde se cargaron esas reglas.Tcsh, zsh y fish tienen mecanismos algo similares (todos se inspiraron en tcsh) pero incorporaron diferentes capacidades, sintaxis y capacidades.
fuente
complete
se llamó. Pero puede encontrar el nombre del archivo de origen y el número de línea donde se define la función de finalización.complete -p sudo # outputs complete -F _sudo sudo
,shopt -s extdebug
,declare -F _sudo # outputs _sudo 3 /usr/share/bash-completion/completions/sudo
. (Pero vea mi comentario sobre la finalización dinámica de la carga ycomplete -p
).and the settings for the basename of the command are applied
. No. Puede tener un compspecs diferente paradate
y/bin/date
. La referencia dice : Si la palabra de comando es una ruta completa, primero se busca una compspec para la ruta completa. Si no se encuentra ninguna compspec para el nombre de ruta completo, se intenta encontrar una compspec para la porción que sigue a la barra final