Estoy tratando de configurar la finalización del directorio en tcsh y/o bash (ambos se usan en mi sitio) con un ligero giro: para un comando en particular "foo" , Me gustaría que complete la función personalizada para que coincida con el primer/-delimitado término a un nodo de subárbol real, y luego siga la finalización de directorio normal para cualquier término sucesivo. Es una especie de combinación de cdpath y terminación, o supongo que una forma de finalización de directorio donde el punto de inicio está controlado por el script de finalización. Que funcionaría de la siguiente manera:Finalización del directorio Tcsh y/o bash con el prefijo de raíz oculta variable
$ foo xxx<TAB>
(custom completion function produces choices it finds at arbitrary levels in the dir tree)
xxxYYY xxxZZZ xxxBLAH ...
foo xxxYYY/<TAB>
(normal directory completion proceeds from this point on, to produce something like:)
foo scene/shot/element/workspace/user/...
Nos gustaría hacer esto porque tenemos un gran árbol de desarrollo de la producción (se trata de una instalación de producción de CGI), que los usuarios de shell-comprensión están navegando y saltando en todo el hora. La queja es que los niveles superiores del árbol son engorrosos y redundantes; solo necesitan una búsqueda rápida en el primer término para encontrar posibles opciones de "encabezado" y completar el directorio desde allí. Parece que la finalización programable podría ofrecer una forma de hacerlo, pero se está volviendo bastante elusivo.
He realizado varios intentos de finalización de bash y tcsh para hacerlo, pero lo más cercano que he obtenido es una forma de "finalización de palabra" donde el usuario debe tratar los niveles de directorio como palabras separadas con espacios (por ej. foo scene/shot/element/workspace/...). Podría seguir pirateando mis scripts actuales, pero me he estado preguntando si hay algo que no entiendo: este es mi primer intento de programar la finalización, y los documentos y ejemplos son bastante escasos en los libros de shell y en Internet. . Si hay algún gurú de la finalización que pueda llevarme por el buen camino, lo agradecería.
FWIW: esto es lo que tengo hasta ahora (en tcsh primero, luego bash). Tenga en cuenta que la raíz estática '/ root/sub1/sub2/sub3' es solo un marcador de posición para una función de búsqueda que encontraría diferentes coincidencias en diferentes niveles. Si puedo conseguir que funcione, puedo subir a la función de búsqueda más tarde. De nuevo, ambos ejemplos completan palabras, lo que requiere que el usuario escriba un espacio después de cada término coincidente (también tengo que eliminar los espacios en la función para construir una ruta real, ¡asco!)
TCSH EJEMPLO (observe que la función es en realidad un script bash):
complete complete_p2 '[email protected]*@`./complete.p2.list.bash $:1 $:2 $:3 $:4 $:5 $:6 $:7 $:8 $:9`@@'
#!/bin/bash --norc
# complete.p2.list.bash - Completion prototype "p2" for shotc command
# Remove spaces from input arguments
ppath=`echo [email protected] | sed -e 's/ //g'`
# Print basenames (with trailing slashes) of matching dirs for completion
ls -1 -d /root/sub1/sub2/sub3/$ppath* 2>/dev/null | sed -e 's#^.*/##' | awk '{print $1 "/"}'
BASH Ejemplo:
_foo()
{
local cur prev opts flist
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
# Get all command words so far (omit command [0] element itself), remove spaces
terms=`echo ${COMP_WORDS[@]:1} | sed -e 's/ //g'`
# Get basenames (with trailing slashes) of matching dirs for completion
flist=`ls -1 -d /root/sub1/sub2/sub3/${terms}* 2>/dev/null | sed -e 's#^.*/##' | awk '{print $1 "/"}' | xargs echo`
COMPREPLY=($(compgen -W "${flist}" ${cur}))
return 0
}
complete -F _foo foo
¿La variable de entorno CDPATH de bash funcionará para usted? – Cascabel
Miré en CDPATH, pero no funciona CON la finalización. Puede "cd name", pero no "cd name ..." Realmente necesito completarlo. –
Pensé que la finalización de bash (el guión adicional lleno de objetos útiles que se incluye con bash en la mayoría de las distribuciones) incluía una definición actualizada de la finalización del CD con CDPATH. – Cascabel