J'ai passé beaucoup de temps dans le Shell récemment et je me demande comment fonctionne la saisie semi-automatique de l'onglet. Quel est le mécanisme derrière cela? Comment le bash connaît-il le contenu de chaque répertoire?
La saisie semi-automatique se compose de 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 l'onglet est enfoncé, pour permettre l'achèvement. Bash donne ensuite (voir le point suivant) une liste des 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 souvent, voir la section Ligne de commande édition du manuel Bash pour plus de détails.)
Bash lui-même a le complete
intégré pour définir un mécanisme de complétion pour les commandes individuelles. Si pour la commande actuelle rien n'est défini, il utilise la complétion par nom de fichier (en utilisant opendir/readdir, comme Ignacio l'a dit).
La partie pour définir vos propres achèvements 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 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 -F function
, qui invoquera ensuite une fonction Shell pour générer la liste des complétions possibles. (Ceci est utilisé par exemple pour l'achèvement de git, qui est très compliqué, 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 idée de ce qui est possible. Si le package bash-complétement est installé (ou quel que soit son nom sur votre système), les compléments pour un grand nombre de commandes sont installés, et comme Wrikken l'a dit, /etc/bash_completion
contient un script bash qui est ensuite souvent exécuté au démarrage de Shell pour le configurer. Des scripts de complétion personnalisés supplémentaires peuvent être placés dans /etc/bash_completion.d
; ils proviennent tous 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. De plus, vous pouvez utiliser readline pour créer vos propres interfaces CLI avec achèvement