¿Hay alguna manera de especificar que un comando en particular tenga insensibilidad de mayúsculas y minúsculas, sin activar la insensibilidad de mayúsculas (al menos para ese shell)?Configuración de la insensibilidad de mayúsculas y minúsculas para la finalización de bashs comando por comando
En mi caso particular, tengo una pequeña aplicación que me da acceso a la línea de comandos a una base de datos de direcciones de correo electrónico, así que escriba:
db get email john smith
y vuelve atrás con dirección de correo electrónico de John Smith. Así que me las he arreglado para permitir la finalización en gran medida dentro de la aplicación: establecer
COMPREPLY=($(compgen -W "$(db --complete $COMP_CWORD "$COMP_WORDS[@]"}")" -- ${COMP_WORDS[COMP_CWORD]}))
obras que me permita a tabuladores completa get
y email
. Sin embargo, si escribo j<tab>
, se niega porque en la base de datos de correo electrónico está debidamente en mayúscula. Me gustaría obtener bash para completar esto de todos modos. (Si uso un capital J
, funciona)
En su defecto, puedo tener mi opción --complete
cambiar el caso de su respuesta haciendo coincidir la entrada, supongo, pero idealmente la línea de comando coincidiría con la base de datos si todo posible.
Tenga en cuenta que tengo esto funcionando dentro de la aplicación cuando uso readline, solo está interactuando con bash que parece ser un problema.
La solución anterior no parece ser del todo correcta, ya que devuelve sólo el primer partido en lugar de todos los partidos . eliminar el "descanso" debería resolver eso. Otro problema es que esto no funciona correctamente en versiones anteriores de bash que no tienen ninguna opción de casecasechch. No sé cuál sería la mejor solución para eso, pero utilicé en mi secuencia de comandos SHOPT local = $ (shopt -p) local IGNORE_CASE = 0 [["$ {SHOPT # * shopt -u nocasematch} "==" $ SHOPT "]] || IGNORE_CASE = 1 – Neuron
Gracias, @Neuron: He actualizado el código para devolver todas las coincidencias. En cuanto a la opción 'nocasematch' que no está disponible (¿sabes en qué versión se introdujo?): Se podría usar tu prueba y luego, en ausencia de la opción, aplicar el' tr [: upper:] [: lower :] 'técnica en el cuerpo del bucle' for'. Una forma un poco más concisa de realizar la prueba de disponibilidad de opción es: 'local haveNoCaseMatch = 0 \ n [[-z" $ (shopt -q nocasematch 2> & 1) "]] && haveNoCaseMatch = 1 ' – mklement0
Debe escribir eso como COMPREPLY = ("$ {matches [@]}") de lo contrario, romperá las opciones de varias palabras (p. ej., nombres de archivos) – Orwellophile