¿Cómo funciona la finalización de la pestaña bash?

113

Últimamente he pasado mucho tiempo en el shell y me pregunto cómo funciona la pestaña de autocompletar. ¿Cuál es el mecanismo detrás de esto? ¿Cómo sabe bash el contenido de cada directorio?

CamelBlues
fuente
2
Es posible que desee comprobar /etc/bash_completion(al menos, ahí es donde está gran parte de la magia de Debian).
Wrikken
1
@Wrikken: Eso es bash_completion, que depende de la finalización de la pestaña, pero no exactamente cómo sucede.
Ignacio Vazquez-Abrams

Respuestas:

100

El autocompletado consta de dos partes:

  • La biblioteca readline, como ya lo mencionó fixje, administra la edición de la línea de comandos y vuelve a llamar a bash cuando se presiona la pestaña para permitir la finalización. Bash entonces da (ver siguiente punto) una lista de terminaciones posibles, e insertos de readline tanto caracteres como se identifican de forma inequívoca por los caracteres ya escritos en. (Se puede configurar la biblioteca readline bastante mucho, ver la sección de edición de línea de comandos de la fiesta manual para más detalles.)

  • Bash en sí tiene incorporado completepara definir un mecanismo de finalización para comandos individuales. Si para el comando actual no se define nada, usó completar por nombre de archivo (usando opendir / readdir, como dijo Ignacio).

    La parte para definir sus propias terminaciones se describe en la sección Terminación programable . En resumen, con complete «options» «command»usted define la finalización de algún comando. Por ejemplo, complete -u sudice que al completar un argumento para el sucomando, busque usuarios del sistema actual .

    Si esto es más complicado de lo que pueden cubrir las opciones normales (por ejemplo, diferentes terminaciones dependiendo del índice de argumento, o dependiendo de los argumentos anteriores), puede usar -F function, que luego invocará una función de shell para generar la lista de posibles terminaciones. (Esto se usa, por ejemplo, para completar git, que es muy complicado, depende del subcomando y, a veces, de las opciones dadas, y a veces usa nombres de ramas (que no son nada que bash conozca).

Puede enumerar las terminaciones existentes definidas en su entorno bash actual usando simplemente complete, para tener una impresión de lo que es posible. Si tiene instalado el paquete bash-complete (o como sea que se llame en su sistema), se instalan finalizaciones para muchos comandos y, como dijo Wrikken, /etc/bash_completioncontiene un script bash que luego se ejecuta a menudo al inicio del shell para configurarlo. Se pueden colocar guiones de finalización personalizados adicionales /etc/bash_completion.d; todos ellos provienen de /etc/bash_completion.

Paŭlo Ebermann
fuente
1
Las páginas de manual solo están disponibles para comandos independientes, no para integraciones de shell. Pero es parte del manual de bash que vinculé.
Paŭlo Ebermann
7

Si está interesado en lo básico: Bash usa readline que presenta historial y finalización básica. Puede inspeccionar la fuente si desea obtener una comprensión detallada. Además, puede utilizar readline para crear sus propias interfaces CLI con finalización

fixje
fuente