Ú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?
Ú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?
Respuestas:
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 complete
para 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 su
dice que
al completar un argumento para el su
comando, 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_completion
contiene 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
.
/etc/bash_completion
(al menos, ahí es donde está gran parte de la magia de Debian).