Travailler efficacement dans le shell
Objectif de cet atelier pratique
- Gagner en efficacité en utilisant la complétion automatique et l'historique des commandes
Travailler moins pour taper plus
Si vous avez patiemment suivi les exemples et les exercices jusqu'ici, il y a des chances pour que vous soyez quelque peu dépité par un certain manque de confort de la console.
-
L'interface en ligne de commande requiert la saisie de commandes interminables, les options, les noms de fichiers, les chemins d'accès complets, etc.
-
Saisir tout ce texte représente une certaine quantité de travail.
-
Personne n'aime travailler.
Il en résulte que personne n'aime travailler en ligne de commande. Le moment est donc venu de se soucier du confort de l'utilisateur. La notion de confort d'utilisation peut également s'appliquer à la ligne de commande, car nous allons aborder une fonctionnalité extrêmement puissante du shell.
La complétion automatique
Commençons par une commande simple :
L'invocation de la commande getenforce
avec son chemin complet représente un
certain travail. En tout et pour tout, il faut saisir vingt caractères et
confirmer par Enter. Pfouh !
Essayons donc de faire plus court. Tapez ceci, sans confirmer par Enter :
Appuyez sur la touche Tab. Vous constatez que le shell a complété ce que vous avez tapé :
Continuez. Ajoutez un S et un B :
Appuyez à nouveau sur Tab :
Ensuite, saisissez G, E, T, E :
Et pour finir, appuyez une dernière fois sur Tab :
Prenons un autre exemple. Imaginons que vous souhaitiez vous rendre dans le
répertoire /boot
. Vous devriez donc taper la commande suivante :
Essayons de procéder de la même façon :
Nous appuyons sur Tab et... il ne se passe rien. Tout au plus, le terminal a émis un bip, c'est tout. Appuyons une seconde fois sur Tab :
Ici, le shell est confronté à une ambiguïté. Il ne sait pas s'il doit se
rendre dans /bin
ou dans /boot
. Lorsque vous avez appuyé une seconde fois
sur Tab, il vous a montré toutes les possibilités qui s'offrent à lui. Pour
lever l'ambiguïté, il suffit de fournir un caractère supplémentaire...
... suivi de Tab :
Voyons un autre exemple pour illustrer ce fonctionnement. Je souhaite afficher
le contenu du répertoire /sbin
. Je fais donc :
Si je me contente de saisir L, S, Space, / et S suivis de Tab, j'entends un simple bip et rien ne se passe. Une seconde pression sur la touche Tab me montre alors toutes les possibilités :
Il suffit donc de saisir le B de /sbin
pour lever l'ambiguïté et
permettre au shell de compléter le nom du répertoire.
Continuons avec un peu de pratique. Dans votre répertoire de téléchargements, créez une série de cinq fichiers vides :
$ cd ~/Téléchargements
$ touch fichier1.txt fichier2.txt fichier3.txt
$ touch fichier3.png fichier3.avi
Admettons que vous souhaitiez afficher les propriétés détaillées de chacun d'entre eux, un par un. Commencez par le premier :
Tab :
1, puis Tab :
Procédez de même avec fichier2.txt
et fichier3.txt
. Vous constaterez
qu'avec fichier3.txt
, vous aurez deux ambiguïtés à lever :
Tab :
3, Tab, Tab :
T, Tab :
Résultat des courses :
-
moins de touches à actionner
-
autant d'heures de loisirs de gagnées, que l'on pourra mettre à contribution pour aller à la plage ou, si le gain de temps est plus modeste dans un premier temps, faire une partie de solitaire ou de démineur
-
plus aucune raison pour détester le travail en ligne de commande
La flemme devient un gage de qualité
La complétion automatique ne sert pas seulement à satisfaire le paresseux qui sommeille en nous tous. Elle joue un autre rôle pour le moins aussi important que celui de vous faire gagner du temps. Fidèle à mes habitudes, je fais précéder mon propos par un exemple pratique.
Le répertoire /etc/X11/xorg.conf.d
est censé contenir une série de réglages
de notre serveur graphique. Ne vous inquiétez pas si vous ne savez pas ce que
c'est. Pour l'instant, nous aimerions seulement afficher le contenu de ce
répertoire, sans trop nous soucier des détails techniques. Nous invoquons donc
la commande suivante, sans utiliser la complétion automatique :
Et nous nous retrouvons face au message d'erreur suivant :
Là, nous restons quelque peu perplexes. La documentation du serveur graphique a pourtant insisté sur l'utilisation de ce répertoire et voilà qu'il n'existe pas. Que se passe-t-il donc ?
Regardez bien : le sous-répertoire de /etc
s'appelle X11
(avec un X
majuscule) et non x11
, ce qui n'est pas la même chose. Maintenant, invoquez à
nouveau cette commande, mais en utilisant la complétion automatique,
c'est-à-dire en tapant :
Tab :
Shift+X, Tab :
X, O, Tab :
Ici, le shell a complété le nom du répertoire correctement. Si nous avions
essayé de taper x
au lieu de X
pour le répertoire X11
, nous nous serions
tout de suite aperçu de notre erreur, suite à l'absence pour le moins suspecte
de X11
dans la liste des répertoires proposés.
Cette petite expérience nous permet de tirer la conclusion suivante. Outre l'avantage d'accélérer la saisie de façon considérable, la complétion automatique offre également un contrôle de qualité, en jouant un rôle non négligeable de correcteur.
Répéter une commande
Dans certains cas, le passage par la case départ est inévitable. Une fois que nous avons invoqué notre commande erronée et qu'elle nous a gratifié d'un message d'erreur, il va bien falloir se résoudre à la ressaisir, en prenant soin de ne pas commettre de faute de frappe. Est-il donc vraiment nécessaire de tout recommencer depuis le début, juste à cause d'une petite coquille ? Non, comme vous le montre cet autre exemple :
$ ls /etc/X11/xorg.donf.d
ls: impossible d'accéder à '/etc/X11/xorg.donf.d':
Aucun fichier ou dossier de ce type
Après la petite seconde de surprise initiale, vous vous apercevez tout de suite
de l'erreur : vous avez tapé xorg.donf.d
au lieu de xorg.conf.d
. Pour
corriger votre erreur, il vous suffirait donc de ressaisir la commande en
prenant soin, cette fois-ci, d'écrire correctement le nom du répertoire. Avant
de faire cela, appuyez simplement sur la touche Up et voyez ce qui se
passe :
Votre shell a gardé la dernière commande en mémoire. Dans ce cas, il sera
plus simple de remplacer le d
par un c
, plutôt que de retaper l'intégralité
de la commande.
Mais ce n'est pas tout. Actionnez plusieurs fois de suite la touche Up et observez ce qui se passe. Apparemment, le shell n'a pas seulement mémorisé la dernière commande, mais toutes les commandes que vous avez pu invoquer depuis belle lurette ! Ajoutez à cela la touche Down et vous voilà capable de naviguer dans l'historique de toutes les commandes saisies jusque-là – enfin, pas toutes, il y a une limite quand même.
Utiliser l'historique des commandes
Il existe un moyen très simple d'afficher la liste de toutes les commandes que vous avez pu saisir :
$ history
...
558 alias rm='rm -i'
559 mkdir repertoiretest
560 touch repertoiretest/fichiertest
561 rm -rf repertoiretest/
562 vimtutor
...
Pour répéter l'une des commandes de la liste, remontez dans l'historique en
appuyant autant de fois que nécessaire sur la touche Up. Dans certains cas,
ce sera un exercice fastidieux, et il vaut mieux afficher l'historique complet,
puis sélectionner la commande directement en tapant un point d'exclamation !
suivi du numéro de la commande. Admettons que je veuille réinvoquer la commande
mkdir repertoiretest
de l'exemple précédent, il me suffirait de lancer la
commande suivante :
Petite mise en garde
Soyez tout de même vigilants en utilisant cette fonctionnalité du shell.
La commande est exécutée directement, sans attendre une quelconque
confirmation avec la touche Enter. Ne l'utilisez donc pas avec des
commandes destructives comme rm
.
Utiliser la recherche inversée
Dans le rayon « historique du shell », voici une dernière astuce
que j'utilise fréquemment au quotidien : la recherche inversée ou reverse
search. Admettons que la dernière fois que vous avez invoqué la commande
mkdir
, c'était pour créer repertoiretest
. Admettons encore que vous ayez
effacé repertoiretest
par la suite et que vous souhaitiez le recréer
maintenant. Pour ce faire, vous avez plusieurs possibilités :
-
invoquer
mkdir repertoiretest
tout simplement, en saisissant tous les caractères de la commande -
actionner la touche Up plusieurs fois de suite, jusqu'à ce que vous finissiez par tomber sur la commande souhaitée
-
afficher l'historique (
history
), chercher la commande que vous souhaitez, puis l'exécuter par le biais du point d'exclamation!
suivi du numéro de la commande dans l'historique
Il existe une autre solution, beaucoup plus simple. Tapez simplement Ctrl+R et vous verrez que votre invite de commande change d'aspect :
À présent, dès que vous tapez les premiers caractères de la commande, le
shell complète instantanément avec ce qu'il trouve dans l'historique. En
l'occurrence, il me suffit ici de saisir m
et k
pour obtenir le résultat
attendu :
Il ne me reste qu'à confirmer par Enter pour exécuter la commande.
Alternativement, je peux appuyer une deuxième fois sur Ctrl+R pour afficher
la prochaine commande dans l'historique qui commence par mk
.
Pour aller plus loin
Comme tous les outils puissants, la complétion automatique et l'utilisation de l'historique des commandes requièrent un certain entraînement avant d'être efficace. Il se peut même qu'au début, cette façon de procéder vous ralentisse. Faites fi de cette frustration initiale et accrochez-vous, car cela en vaut vraiment la peine. L'utilisation systématique de ces techniques de saisie vous fera gagner un temps considérable.
Apprenez à dactylographier
J'en profite pour vous prodiguer un autre conseil : apprenez à dactylographier, c'est-à-dire à utiliser vos dix doigts sans regarder le clavier. Là aussi, les bénéfices que vous en tirerez dépasseront de loin l'investissement que cela nécessite au départ. Pensez en termes de productivité accrue et surtout de migraines évitées. Vos yeux n'auront plus à effectuer des va-et-vient incessants entre les touches.