Comment fonctionne l’achèvement de l’onglet bash?

J’ai passé beaucoup de temps dans le shell récemment et je me demande comment l’onglet se termine automatiquement. Quel est le mécanisme derrière cela? Comment le bash connaît-il le contenu de chaque répertoire?

L’autocomplétion comporte deux parties:

  • La bibliothèque readline, déjà mentionnée par fixje, gère la modification de la ligne de commande et renvoie à bash lorsque vous appuyez sur la touche tab, pour permettre l’achèvement. Bash donne ensuite (voir le point suivant) une liste de complétions possibles, et readline insère autant de caractères identifiés sans ambiguïté par les caractères déjà saisis. (Vous pouvez configurer la bibliothèque readline assez bien, voir la section Modification de la ligne de commande du Bash manuel pour plus de détails.)

  • Bash lui-même possède la fonction intégrée pour définir un mécanisme d’achèvement des commandes individuelles. Si pour la commande en cours, rien n’est défini, il utilisait la complétion par nom de fichier (en utilisant opendir / readdir, comme dit Ignacio).

    La partie pour définir vos propres complétions est décrite dans la section Achèvement programmable . En bref, avec la commande complete «options» «command» vous définissez l’achèvement de certaines commandes. Par exemple, complete -u su indique que lorsque vous complétez un argument pour la commande su , recherchez les utilisateurs du système actuel .

    Si cela est plus compliqué que ce que les options normales peuvent couvrir (par exemple, différentes complétions en fonction de l’index des arguments ou en fonction des arguments précédents), vous pouvez utiliser la -F function , qui invoquera alors une fonction shell pour générer la liste des complétions possibles. (Ceci est utilisé par exemple pour la complétion de git, ce qui est très compliqué, dépendant de la sous-commande et parfois des options données, et utilisant parfois des noms de twigs (qui ne sont pas connus de bash).

Vous pouvez lister les complétions existantes définies dans votre environnement bash actuel en utilisant simplement complete , pour avoir une impression sur ce qui est possible. Si le paquet bash-completion est installé (ou nommé sur votre système), les complétions pour un grand nombre de commandes sont installées et, comme l’a dit Wrikken, /etc/bash_completion contient un script bash qui est souvent exécuté au démarrage du shell. pour configurer ceci. Des scripts de complétion personnalisés supplémentaires peuvent être placés dans /etc/bash_completion.d ; ceux-ci proviennent de /etc/bash_completion .

Si vous êtes intéressé par les bases: Bash utilise readline qui présente l’historique et l’achèvement de base. Vous pouvez inspecter la source si vous souhaitez obtenir une compréhension détaillée. En outre, vous pouvez utiliser readline pour créer vos propres interfaces CLI