96 votes

Emplacement standard pour les bash_completion.d définis par l'utilisateur scripts ?

J'ai un accès utilisateur (pas de root) dans une machine Linux (Suse) où j'ai développé quelques bash scripts et les règles d'autocomplétion bash correspondantes.

Puisque les scripts n'appartiennent qu'à mon utilisateur et que j'ai donc besoin que les règles complètes ne soient "actives" que pour moi (une partie du fait que je n'ai pas d'accès en écriture root), placer mon scripts de bash_completion dans /etc/bash_completion.d/ n'est pas une option.

Pour le moment, j'ai nommé mon fichier .bash_completion.myscript et la source directement à partir de mon .bashrc mais je me demande s'il existe un autre moyen "standard" d'obtenir ces résultats, déjà pris en compte dans l'implémentation de bash.

Par exemple, la création d'un dossier /home/myuser/.bash_completion.d/ ?

82voto

Russell E Glaue Points 861

Pour les environnements non-XDG et bash-completion <= 2.8

Voici comment un utilisateur local peut disposer d'un outil de travail. ~/.bash_completion.d/ répertoire.

  1. modifier le fichier : nano ~/.bash_completion ajoutez ce qui suit :
for bcfile in ~/.bash_completion.d/* ; do
  . $bcfile
done
  1. faire le répertoire : mkdir ~/.bash_completion.d
  2. modifier le fichier : ~/.bash_completion.d/myscript ajoutez ce qui suit :
_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
  1. source .bash_completion : . ~/.bash_completion

anticipation d'un répertoire ~/.bash_completion.d/ vide

Si vous prévoyez d'avoir un espace vide ~/.bash_completion.d/ et vous voulez éviter de voir le message d'erreur bash: /home/<username>/.bash_completion.d/*: No such file or directory ajouter un test de type de fichier avec [ -f "$bcfile" ] .

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

Pour les environnements XDG & bash-completion <= version 2.8

(Pour voir votre version : rpm -qa | grep bash-completion )

Notez que la documentation README de bash-completion 2.8 recommande encore ~/.bash_completion Voir https://github.com/scop/bash-completion/tree/2.8

Vous savez que votre environnement linux est XDG si xdg-usr-dir existe et renvoie votre répertoire personnel, et vos variables d'environnement incluent XDG_* ; exécuter : env | grep XDG .

Pour l'environnement XDG & bash-completion >= version 2.9

Selon le README de bash-completion à partir de la version 2.9 https://github.com/scop/bash-completion/tree/2.9 (27 avril 2019) il est maintenant reconnu un répertoire de travail utilisateur local bash_completion. En outre, un autre fichier de configuration bash_completion a déjà été pris en charge pour plusieurs versions précédentes.

  • ~/.bash_completion.d -> ${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion
  • ~/.bash_completion -> ${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion

_Pour mettre en œuvre cette configuration, effectuez les étapes précédentes 3,4 ci-dessus en utilisant $XDG_DATA_HOME/bash-completion - vous ne devez pas modifier $XDG_CONFIG_HOME/bash_completion comme décrit à l'étape 1, mais il se peut que vous deviez créer le fichier $XDG_DATA_HOME/bash-completion répertoire._

Note : À partir de CentOS 8.2 et Fedora 32, bash-completion <= 2.8 est installé.

56voto

jason saldo Points 5036

Utilisez un ~/.bash_completion fichier.

De la FAQ sur l'achèvement du Bash :

Q. Comment puis-je insérer mes propres compléments locaux sans avoir à
les réinsérer à chaque fois que vous publiez une nouvelle version ?

A. Mettez-les dans ~/.bash_completion, qui est analysé à la fin de la commande
achèvement principal script. Voir aussi la question suivante.

Q. Je suis l'auteur/maintenant du paquet X et j'aimerais maintenir mon propre système d'information.
code d'achèvement pour ce paquet. Où dois-je le mettre pour être sûr
que les shells bash interactifs le trouveront et en feront la source ?

A. Installez-le dans l'un des répertoires pointés par
les variables du fichier pkgconfig de bash-completion. Il y a deux
alternatives : celle qui est recommandée est 'completionsdir' (à obtenir avec
"pkg-config --variable=completionsdir bash-completion") à partir duquel
Les compléments sont chargés à la demande en fonction des noms des commandes invoquées,
assurez-vous donc de nommer votre fichier de complétion en conséquence, et d'inclure
par exemple des liens symboliques au cas où le fichier fournirait des compléments
pour plus d'une commande. L'autre qui est présente pour
pour des raisons de rétrocompatibilité, est "compatdir" (à obtenir avec la commande
"pkg-config --variable=compatdir bash-completion") à partir de quels fichiers
sont chargés lorsque bash_completion est chargé.

32voto

Jérôme Points 180

El FAQ a été mis à jour. Il y a maintenant un endroit standard pour les achèvements locaux.

Q. Où dois-je installer mes propres compléments locaux ?

A. Placez-les dans le sous-répertoire completions de $BASH_COMPLETION_USER_DIR (par défaut $XDG_DATA_HOME/bash-completion ou ~/.local/share/bash-completion si $XDG_DATA_HOME n'est pas défini) pour les charger à la demande. Voir aussi la réponse à la question suivante pour les considérations concernant les noms de ces fichiers, elles s'appliquent ici aussi. Alternativement, vous pouvez les écrire directement dans ~/.bash_completion qui est chargé avidement par notre script principal.

  1. S'il n'existe pas, créez un répertoire à l'adresse suivante ~/.local/share/bash-completion/completions (o $XDG_DATA_HOME/bash-completion/completions ).

    $ mkdir -p ~/.local/share/bash-completion/completions

  2. Mettez vos compléments dans le nouveau répertoire.

    $ cp <your_completions_file> ~/.local/share/bash-completion/completions

Notez que le fichier de complétions doit avoir le même nom que la commande pour laquelle il fournit des compléments. (par exemple, le fichier de complétions pour git devrait s'appeler "git").

9voto

Adeel Points 57

Au moins bash-completion 2.8 et les versions ultérieures permettent de placer les compléments locaux de Bash dans répertoire

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

Les noms des fichiers d'achèvement ou des liens symboliques doivent correspondre aux noms des commandes respectives. Ces complétions ne sont chargées que sur demande. Les complétions stockées dans fichier ~/.bash_completion sont toujours chargés.

Référence : Voir "Q. Où dois-je installer mes propres complétions locales ?" dans https://github.com/scop/bash-completion/blob/master/README.md

6voto

npmccallum Points 31

Une solution plus simple consiste à utiliser l'option nullglob. Bien que cela ne soit pas portable, les complétions bash ne le sont pas non plus. La portabilité n'a donc pas d'importance.

De même, vous devrez utiliser des guillemets autour de la variable lors de la recherche de sources. Cela permet de gérer le cas où le fichier contient des espaces ou d'autres caractères spéciaux.

shopt -s nullglob

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X