J'ai un accès utilisateur (pas de racine) sur une machine Linux (Suse) où j'ai développé quelques scripts bash et les règles de saisie semi-automatique bash correspondantes.
Étant donné que les scripts n'appartiennent qu'à mon utilisateur et que j'ai donc besoin des règles complètes uniquement "actives" pour moi (en partie du fait que je n'ai pas d'accès en écriture root), en plaçant mon script bash_completion dans /etc/bash_completion.d/
le dossier n'est pas une option.
En ce moment, j'ai nommé mon fichier .bash_completion.myscript
et source directement depuis mon .bashrc
, mais je me demande simplement 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, créer un dossier /home/myuser/.bash_completion.d/
?
Utiliser un ~/.bash_completion
fichier.
De la FAQ de fin de Bash :
Q. Comment puis-je insérer mes propres complétions locales sans avoir à
les réinsérez chaque fois que vous publiez une nouvelle version?A. Mettez-les dans ~/.bash_completion, qui est analysé à la fin de la
script d'achèvement principal. Voir aussi la question suivante.Q. Je crée/gère le package X et je souhaite gérer le mien
code d'achèvement pour ce package. Où dois-je le mettre pour être sûr
que les shell bash interactifs le trouveront et le trouveront?A. Installez-le dans l'un des répertoires pointés par
Variables du fichier pkgconfig de bash-complétion. Il y en a deux
alternatives: celle qui est recommandée est "completionsdir" (obtenez-la avec
"pkg-config --variable = completionsdir bash-complètement") à partir duquel
achèvements sont chargés à la demande en fonction des noms des commandes invoquées,
assurez-vous donc de nommer votre fichier d'achèvement en conséquence et d'inclure
par exemple des liens symboliques au cas où le fichier fournirait des compléments
pour plusieurs commandes. L'autre qui est présent pour
les raisons de compatibilité ascendante sont 'compatdir' (obtenez-le avec
"pkg-config --variable = compatdir bash-complét" "à partir de quels fichiers
sont chargés lorsque bash_completion est chargé.
Voici comment un utilisateur local peut avoir un répertoire ~/.bash_completion.d/
Fonctionnel.
modifier le fichier: nano ~/.bash_completion
, ajoutez ce qui suit:
for bcfile in ~/.bash_completion.d/* ; do . $bcfile done
créer un répertoire: mkdir ~/.bash_completion.d
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
source .bash_completion: . ~/.bash_completion
Mise à jour
Si vous prévoyez d'avoir un répertoire ~/.bash_completion.d/
Vide et que vous souhaitez éviter de voir le message d'erreur bash: /home/<username>/.bash_completion.d/*: No such file or directory
, Ajoutez un test de type de fichier avec [ -f "$bcfile" ]
.
for bcfile in ~/.bash_completion.d/* ; do [ -f "$bcfile" ] && . $bcfile done
Au moins bash-complètement 2.8 et plus tard, activez l'option pour placer les complétions locales de Bash dans le répertoire
${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions
Les noms des fichiers d'achèvement ou les noms des liens symboliques doivent correspondre aux noms de commande respectifs. Ces finitions sont chargées uniquement sur demande. Complétions stockées dans le fichier ~/.bash_completion
sont toujours chargés.
Référence: Voir "Q. Où dois-je installer mes propres compléments locaux?" dans https://github.com/scop/bash-completion/blob/master/README.md
Le réponse de Russell E Glaue est super mais son ~/.bash_completion
est incomplet.
Le problème est lorsque ~/.bash_completion.d/
est vide et par la suite for f in ~/.bash_completion.d/*
imprime le message d'erreur suivant:
-bash: /home/user/.bash_completion.d/*: Aucun fichier ou répertoire de ce type
La solution la plus simple et portable consiste à ignorer la boucle si le répertoire est vide:
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
Une solution plus simple consiste à utiliser l'option nullglob. Bien que ce ne soit pas portable, les compléments bash ne le sont pas non plus. La portabilité n'a donc pas d'importance.
En outre, vous souhaiterez utiliser des guillemets autour de la variable lors de l'approvisionnement. Cela gère le cas où le fichier contient des espaces d'autres autres caractères spéciaux.
shopt -s nullglob
for f in ~/.bash_completion.d/*; do
[ -f "$f" ] && . "$f"
done