Comment fonctionne la complétion des onglets bash?

113

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

CamelBlues
la source
2
Vous voudrez peut-être vérifier /etc/bash_completion(du moins, c'est là que réside une grande partie de la magie dans Debian).
Wrikken
1
@Wrikken: C'est bash_completion, qui dépend de l'achèvement de l'onglet, mais pas vraiment de la façon dont cela se passe.
Ignacio Vazquez-Abrams

Réponses:

100

L'auto-complé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 tab est pressé, pour permettre la complétion. Bash donne alors (voir le 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 assez souvent, voir la section Edition en ligne de commande du manuel pour plus de détails.)

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

    La partie pour définir vos propres complétions est décrite dans la section Complétion programmable . En bref, avec complete «options» «command»vous définissez l'achèvement de certaines commandes. Par exemple complete -u su, lorsque vous complétez un argument pour la sucommande, 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 de l'argument, ou en fonction des arguments précédents), vous pouvez utiliser -F function, qui appellera alors une fonction shell pour générer la liste des complétions possibles. (Ceci est utilisé par exemple pour la complétion git, qui est très compliquée, en fonction de la sous-commande et parfois des options données, et en utilisant parfois des noms de 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 impression sur ce qui est possible. Si vous avez installé le package bash-completion (ou quel que soit le nom sur votre système), les complétions pour de nombreuses commandes sont installées et, comme Wrikken l'a dit, /etc/bash_completioncontient un script bash qui est ensuite souvent exécuté au démarrage du shell pour le configurer. Des scripts de complétion personnalisés supplémentaires peuvent être placés dans /etc/bash_completion.d; ceux-ci proviennent tous de /etc/bash_completion.

Paŭlo Ebermann
la source
1
Les pages de manuel ne sont là que pour les commandes indépendantes, pas pour les commandes internes du shell. Mais cela fait partie du manuel bash que j'ai lié.
Paŭlo Ebermann
7

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

fixje
la source