¿Lugar estándar para los scripts bash_completion.d definidos por el usuario?


47

Tengo acceso de usuario (sin root) a una máquina Linux (Suse) donde desarrollé algunos scripts de bash y las reglas de autocompletado de bash correspondientes.

Dado que los scripts pertenecen solo a mi usuario y, por lo tanto, necesito que las reglas completas solo estén "activas" para mí (una parte del hecho de que no tengo acceso de escritura raíz), colocar mi script bash_completion en la /etc/bash_completion.d/carpeta no es una opción.

En este momento nombré mi archivo .bash_completion.myscripty lo .bashrcobtuve directamente de mi , pero me pregunto si hay alguna otra forma "estándar" de lograr estos resultados, ya considerada en la implementación de bash.

Por ejemplo, ¿creando una carpeta /home/myuser/.bash_completion.d/?

Respuestas:


36

Usa un ~/.bash_completionarchivo.

De las preguntas frecuentes de finalización de Bash :

P. ¿Cómo puedo insertar mis propias terminaciones locales sin tener que
volver a insertarlas cada vez que emita una nueva versión?

A. Póngalos en ~ / .bash_completion, que se analiza al final del
script de finalización principal. Ver también la siguiente pregunta.

P. Autorizo ​​/ mantengo el paquete X y me gustaría mantener mi propio
código de finalización para este paquete. ¿Dónde debo ponerlo para asegurarme de
que los bash shell interactivos lo encontrarán y lo encontrarán?

A. Instálelo en uno de los directorios señalados por
las variables del archivo pkgconfig de bash-completar. Hay dos
alternativas: la recomendada es 'completionsdir' (
obténgala con "pkg-config --variable = completionsdir bash-complete") desde la cual las
terminaciones se cargan a pedido según los nombres de los comandos invocados,
así que asegúrese de nombrar su archivo de finalización en consecuencia, e incluir,
por ejemplo, enlaces simbólicos en caso de que el archivo proporcione finalizaciones
para más de un comando. El otro que está presente por
razones de compatibilidad con versiones anteriores es 'compatdir' (obténgalo con
"pkg-config --variable = compatdir bash-complete"


Busqué en Google y busqué mucho dentro de serverfault antes de preguntar, pero no pensé en el paso más básico: ¡RTFM! ¡Muchas gracias por la respuesta!
Carles Sala

44
Es posible que desee especificar que .bash_completiones un archivo y no un directorio. Dado que bash_completion.des un directorio, supuse que podría simplemente cambiar scpmi bash_completion.dnombre local en el servidor remoto, pero en el siguiente inicio de sesión me dijo que tenía que ser un archivo.
NobleUplift

3
@NobleUplift Bash Completion FAQ ha cambiado y ahora contiene información sobre una forma de cargar las terminaciones de Bash del usuario desde un directorio bajo demanda. Esto parece funcionar con bash-complete versión 2.8 al menos, pero no con 2.1. Los archivos en el directorio deben nombrarse exactamente como el comando para el que están destinados, o se podrían usar enlaces simbólicos para ese propósito.
Jarno

@jarno Codifiqué los scripts de finalización de bash para todos los programas y scripts personalizados en nuestro sistema, pero mis desarrolladores principales los eliminaron :(
NobleUplift

@NobleUplift ¿por qué? Puedes usarlos para ti de todos modos.
jarno

49

Así es como un usuario local puede tener un ~/.bash_completion.d/directorio de trabajo .

  1. editar archivo:, nano ~/.bash_completionagregue lo siguiente:

    for bcfile in ~/.bash_completion.d/* ; do
      . $bcfile
    done
  2. hacer directorio: mkdir ~/.bash_completion.d

  3. editar archivo:, ~/.bash_completion.d/myscriptagregue lo siguiente:

    _myscript_tab_complete () {
        local cur prev opts
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        words="-f -h --etc"
    
        COMPREPLY=( $(compgen -W "${words}" -- ${cur}) )
        return 0
    }
    complete -F _myscript_tab_complete myscript
  4. fuente .bash_completion: . ~/.bash_completion

Actualizar

Si anticipa tener un ~/.bash_completion.d/directorio vacío y desea evitar ver el mensaje de error bash: /home/<username>/.bash_completion.d/*: No such file or directory, agregue una prueba de tipo de archivo con [ -f "$bcfile" ].

for bcfile in ~/.bash_completion.d/* ; do
  [ -f "$bcfile" ] && . $bcfile
done

2

La respuesta de Russell E Glaue es excelente, pero ~/.bash_completionestá incompleta.

El problema es cuando ~/.bash_completion.d/está vacío y posteriormente for f in ~/.bash_completion.d/*imprime el siguiente mensaje de error:

-bash: /home/user/.bash_completion.d/*: No existe tal archivo o directorio

La solución más simple y portátil es omitir el bucle si el directorio está vacío:

if [[ -d ~/.bash_completion.d/ ]] && \
   ! find ~/.bash_completion.d/. ! -name . -prune -exec false {} +
then
    for f in ~/.bash_completion.d/*
    do
        source "$f"
    done
fi

1

Una solución más simple es usar la opción nullglob. Si bien esto no es portátil, tampoco lo son las terminaciones de bash. Entonces la portabilidad no importa.

Además, querrá usar comillas alrededor de la variable al buscar fuentes. Esto maneja el caso donde el archivo tiene espacios otros otros caracteres especiales.

shopt -s nullglob

for f in ~/.bash_completion.d/*; do
  [ -f "$f" ] && . "$f"
done

1
Para su información, una explicación de (o enlace a documentos) sobre algo que se muestra (es decir nullglob) es útil para el lector.
Cometsong

1

Al menos bash-complete 2.8 y posterior habilitan la opción para colocar terminaciones de Bash locales en el directorio

${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions

Los nombres del archivo de finalización o los nombres de los enlaces simbólicos deben coincidir con los nombres de los comandos respectivos. Estas terminaciones se cargan solo bajo demanda. Las terminaciones almacenadas en el archivo ~/.bash_completion se cargan siempre.

Referencia: consulte "P. ¿Dónde debo instalar mis propias terminaciones locales?" en https://github.com/scop/bash-completion/blob/master/README.md

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.