Sous Linux, lors de la saisie d'une commande si vous appuyez deux fois sur TAB, toutes les commandes disponibles commençant par des caractères saisis seront répertoriées.
Ce n'est pas nouveau, vous le savez probablement déjà. Cette fonctionnalité est appelée complétion bash. La complétion de base des noms de fichiers et de répertoires est disponible par défaut dans la ligne de commande bash.
Mais, nous pouvons booster cette complétion bash et passer au niveau supérieur en utilisant la commande complete.
Ce didacticiel explique comment nous pouvons appliquer l'auto-complétion aux options et aux arguments de la commande à l'aide de la complétion programmable.
Par exemple, après avoir tapé la commande d'écriture, si vous appuyez deux fois sur la touche de tabulation, l'auto-complétion fournit la liste des utilisateurs pour effectuer l'opération d'écriture.
$ write [TAB][TAB] bala raj jason randy john ritu mayla thomas nisha www-data
Dans l'exemple suivant, il afficherait les noms d'hôte disponibles pour la commande telnet :
$ telnet [TAB][TAB] localhost dev-db fileserver
Pour obtenir la complétion programmable dans votre terminal, il vous suffit d'exécuter /etc/bash_completion comme indiqué ci-dessous,
# . /etc/bash_completion
Vous pouvez également décommenter les lignes ci-dessous dans /etc/bash.bashrc (à partir d'ubuntu linux 13.04) afin de ne pas avoir à exécuter explicitement la commande ci-dessus,
enable bash completion in interactive shells if ! shopt -oq posix; then if [ -f /usr/share/bash-completion/bash_completion ]; then . /usr/share/bash-completion/bash_completion elif [ -f /etc/bash_completion ]; then . /etc/bash_completion fi fi
Si vous ne trouvez pas ces lignes et le fichier /etc/bash_completion, il vous suffit d'installer le package appelé bash_completion par apt-get
1. Afficher la complétion bash existante
Après avoir activé l'achèvement bash programmable, un ensemble d'achèvements bash est défini. La commande complete est utilisée pour définir l'achèvement bash.
Pour afficher la complétion bash existante, utilisez la commande complete comme indiqué ci-dessous.
complete -p | less
L'option -p est facultative dans l'exemple ci-dessus.
2. Liste des complétions standard dans Bash
Bash fournit par défaut la complétion standard suivante pour les utilisateurs Linux.
- Complétion de nom de variable
- Saisie du nom d'utilisateur
- Complétion du nom d'hôte
- Complétion du chemin d'accès
- Complétion du nom de fichier
Nous en avons discuté dans notre précédent article sur l'achèvement standard de bash.
3. Définir l'achèvement pour obtenir des commandes
Définissez une complétion avec la commande -c pour obtenir la liste des commandes disponibles en argument. Dans l'exemple suivant, la complétion est définie pour quelle commande,
$ complete -c which $ which [TAB][TAB] Display all 2116 possibilities? (y or n)
Comme vu ci-dessus, en appuyant sur 'y', toutes les commandes seront listées.
4. Définir l'achèvement pour obtenir des répertoires
Avec l'option d, la complétion peut être définie pour n'obtenir que les noms de répertoires en argument. Dans l'exemple suivant, complétion définie pour ls,
$ ls countfiles.sh dir1/ dir2/ dir3/ $ complete -d ls $ ls [TAB][TAB] dir1/ dir2/ dir3/
Comme vu ci-dessus, appuyer sur l'onglet ne vous montre que les répertoires.
5. Définir l'achèvement pour obtenir les noms des tâches en arrière-plan
Avec complete, il est également possible d'obtenir des noms de travaux en tant qu'arguments de commandes. L'option j est utilisée pour passer des noms de travail comme argument à la commande job comme indiqué ci-dessous,
$ jobs [1]- Stopped cat [2]+ Stopped sed 'p' $ complete -j ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] cat sed
En parlant de tâches d'arrière-plan, vous devez également savoir comment gérer les tâches d'arrière-plan Linux à l'aide de ces exemples.
6. Complétion avec préfixe et suffixe
Les complétions peuvent être définies avec le préfixe souhaité à ajouter et le suffixe à ajouter aux complétions réelles. Dans l'exemple suivant, le préfixe et le suffixe sont définis pour list_job_attrib.sh,
$ jobs [1]+ Stopped cat $ complete -P '">' -S '<"' ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] $ ./list_job_attrib.sh ">cat<"
7. Achèvement de noms de fichiers et de répertoires avec exclusion
Considérez que le script termine son exécution, la sortie a été écrite dans un répertoire de sortie comme suit
$ cd output/ $ ls all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt parser_mod.tmp extract.o
Dans ce qui précède, si vous devez ignorer les fichiers .tmp et .o pour l'auto-complétion avec la commande ls,
$ export FIGNORE='.tmp:.o' $ complete -f -d ls $ cd output $ ls [TAB][TAB] all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt
FIGNORE est la variable shell qui contient le suffixe des noms de fichiers et ceux-ci sont exclus de l'auto-complétion.
8. Fractionner une chaîne par IFS pour obtenir des valeurs d'achèvement
La liste de mots peut être mentionnée avec l'option -W et celle-ci est divisée avec la valeur de la variable IFS. Ensuite, chaque mot résultant est développé et affiché pour être complété,
$ export IFS=" " $ complete -W "bubble quick" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
Comme indiqué ci-dessus, après avoir divisé la chaîne par délimiteur IFS, le mot est développé, il est donc également possible de les avoir comme variables, comme indiqué ci-dessous,
$ echo $SORT_TYPE1 bubble $ echo $SORT_TYPE2 quick $ complete -W "$SORT_TYPE1 $SORT_TYPE2" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
9. Écrivez votre propre fonction pour générer l'achèvement
Il vous permet d'inclure une fonction pour définir l'achèvement. Avec l'option -F, le nom de la fonction est passé à la commande complète et il est exécuté pour générer des complétions. Par exemple, les fonctions sont écrites comme indiqué ci-dessous,
_parser_options() { local curr_arg; curr_arg=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W '-i --incoming -o --outgoing -m --missed' -- $curr_arg ) ); }
où dans la fonction ci-dessus,
- COMPREPLY :le tableau contient les résultats de complétion qui s'affichent après avoir appuyé sur [TAB][TAB]
- COMP_WORDS :tableau de mots qui est tapé sur la ligne de commande
- COMP_CWORD :l'index du tableau COMP_WORDS et l'utilisation de ces différents mots de position sur la ligne de commande sont accessibles.
- compgen :-W contient les complétions possibles et l'argument respectif est choisi en fonction de $current_arg
Cette fonction présente dans le fichier parser_option est extraite comme indiqué ci-dessous,
$ source parser_option
Liez cette fonction à votre script d'analyseur comme indiqué ci-dessous,
$ complete -F _parser_options ./parser.pl $ ./parser.pl [TAB][TAB] -i --incoming -o --outgoing -m --missed
Comme vu ci-dessus, les options des analyseurs sont générées par la fonction _parser_options().
Remarque :regardez /etc/bash_completion pour afficher plus de fonctions de complétion programmable.
10. Spécification secondaire lorsque le primaire n'en génère aucune
S'il n'y a pas de correspondances générées par la spécification de complétion définie, alors l'option comp est prise pour la complétion mentionnée avec l'option -o.
$ complete -F _count_files -o dirnames ./countfiles.sh
Comme ci-dessus, la complétion est définie avec la fonction _count_files pour le fichier ./countfiles.sh. Si la fonction _count_files() ne génère aucune correspondance, la complétion du répertoire est tentée.
$ ls countfiles.sh dir1/ dir2/ dir3/ $./countfiles.sh [TAB][TAB] dir1 dir2 dir3