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?
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?
Réponses:
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é complete
pour 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 su
commande, 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_completion
contient 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
.
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
/etc/bash_completion
(du moins, c'est là que réside une grande partie de la magie dans Debian).