135 votes

Comment fonctionne la complétion de tabulation en bash ?

J'ai passé beaucoup de temps dans le shell ces derniers temps et je me demande comment fonctionne l'autocomplétion des onglets. Quel est le mécanisme derrière cela ? Comment le bash connaît-il le contenu de chaque répertoire ?

3 votes

Vous pouvez vérifier /etc/bash_completion (du moins, c'est là que se trouve une grande partie de la magie dans Debian).

1 votes

@Wrikken : C'est bash_completion, qui dépend de la complétion de tabulation, mais pas tout à fait de la façon dont cela se produit.

4 votes

120voto

Paŭlo Ebermann Points 35526

L'autocomplétion comporte deux parties :

  • La bibliothèque readline, comme déjà mentionné par fixje, gère l'édition de la ligne de commande, et rappelle à bash lorsque la touche tab est pressée, pour permettre la complétion. Bash donne alors (voir point suivant) une liste de complétions possibles, et readline insère autant de caractères que ceux identifiés sans ambiguïté par les caractères déjà tapés. (Vous pouvez configurer la bibliothèque readline de manière assez large, voir la section Edition en ligne de commande du manuel Bash pour plus de détails).

  • Bash a lui-même la fonction intégrée complete pour définir un mécanisme d'achèvement pour les commandes individuelles. Si rien n'est défini pour la commande actuelle, elle utilise la complétion par le nom du fichier (en utilisant opendir/readdir, comme l'a dit Ignacio).

    La partie permettant de définir vos propres complétions est décrite dans la section Achèvement programmable . En bref, avec complete «options» «command» vous définissez l'achèvement d'une commande. Par exemple complete -u su dit en complétant un argument pour le su recherche les utilisateurs du système actuel .

    Si cela est plus compliqué que le options normales peuvent couvrir (par exemple, différentes complétions en fonction de l'index de l'argument, ou en fonction des arguments précédents), vous pouvez utiliser -F function qui invoquera ensuite une fonction shell pour générer la liste des compléments possibles. (Ceci est utilisé par exemple pour la complétion de git, qui est très compliquée, dépendant de la sous-commande et parfois des options données, et utilisant parfois les noms des branches (qui sont souvent des noms d'utilisateurs). des options données, et utilisant parfois les noms des branches (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 idée de ce qui est possible. Si vous avez installé le paquet bash-completion (ou quel que soit son nom sur votre système), les complétions pour beaucoup de commandes sont installées, et comme Wrikken l'a dit, /etc/bash_completion contient un script bash qui est ensuite souvent exécuté au démarrage du shell pour le configurer. D'autres script de complétion personnalisés peuvent être placés dans le fichier /etc/bash_completion.d ; ils proviennent tous de /etc/bash_completion .

1 votes

Les pages de manuel ne sont là que pour les commandes indépendantes, pas pour les modules intégrés au shell. Mais cela fait partie du manuel de bash dont j'ai donné le lien.

7voto

fixje Points 51

Si vous êtes intéressé par l'essentiel : Bash utilise ligne de lecture qui présente l'histoire 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 construire vos propres interfaces CLI avec complétion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X