2011-04-06 7 views
85

He estado pasando mucho tiempo en el shell últimamente y me pregunto cómo funciona la función de autocompletar. ¿Cuál es el mecanismo detrás de esto? ¿Cómo sabe el bash el contenido de cada directorio?¿Cómo funciona la finalización de la pestaña bash?

+2

Es posible que desee comprobar '/ etc/bash_completion' (al menos, eso es donde una gran cantidad de la magia está en Debian). – Wrikken

+1

@Wrikken: eso es bash_completion, que depende de la finalización de la pestaña, pero no del todo como sucede. –

+2

También hay varias preguntas sobre el StackExchange * nix, entre ellos: http://unix.stackexchange.com/questions/4738/an-easy-bash-completion-tutorial http://unix.stackexchange.com/questions/1800/custom-autocomplete http://unix.stackexchange.com/questions/12356/how-does-tab-auto-complete-find-options-to-complete y al menos uno en SU: http://superuser.com/ preguntas/289539/custom-bash-tab-completion – Cascabel

Respuesta

81

Hay dos partes en el autocompletado:

  • La biblioteca readline, como ya se ha mencionado por fixje, dirige la edición de línea de comandos, y vuelve a llamar a bash cuando se presiona la pestaña, para habilitar la finalización. Bash entonces da (ver siguiente punto) una lista de terminaciones posibles, y readline inserta tantos caracteres como se identifican de forma inequívoca por los caracteres ya escritos en. (Se puede configurar la biblioteca readline bastante mucho, consulte la sección Command line editing del manual del golpe de detalles)

  • Bash tiene el buildin complete para definir un mecanismo de finalización para comandos individuales. Si para el comando actual no se define nada, utilizó la terminación por nombre de archivo (utilizando opendir/readdir, como dijo Ignacio).

    La parte a definir sus propias terminaciones se describe en la sección Programmable Completion. En resumen, con complete «options» «command» define la finalización de algún comando. Por ejemplo complete -u su dice al completar un argumento para el comando su, la búsqueda de los usuarios del sistema actual.

    Si esto es más complicado que los opciones normales pueden cubrir (por ejemplo, diferentes terminaciones en función de índice de discusión, o en función de los argumentos anteriores), puede utilizar -F function, que a su vez invocar una función de línea para generar la lista de posibles terminaciones. (Esto se utiliza, por ejemplo, para la realización de git, que es muy complicado, dependiendo de subcomando ya veces sobre las opciones dado, y utilizando a veces nombres de ramas (que no son otra fiesta conoce).

Usted puede enumerar las terminaciones existentes definidos en el entorno de fiesta actual utilizando simplemente complete, para tener una impresión de lo que es posible. Si tiene instalado el paquete bash-finalización (o como se denomina en el sistema), terminaciones para un montón de comandos están instalados, y como dijo Wrikken,/etc/bash_completion contiene un script bash que a menudo se ejecuta al inicio del shell para configurarlo. Se pueden colocar scripts de finalización personalizados adicionales en /etc/bash_completion.d; todos provienen de/etc/bash_completion.

7

Si está interesado en los conceptos básicos: Bash usa readline que muestra el historial y la finalización básica. Puede inspeccionar la fuente si desea obtener una comprensión detallada. Además, puede utilizar readline para construir sus propias interfaces CLI con la finalización

Cuestiones relacionadas