Contexte
Typeahead dans bash :bien
Lorsqu'un shell bash est occupé (initialisation, exécution d'une commande), on peut taper avant que la prochaine invite n'apparaisse .
Si le shell a lancé un programme, ce programme capturera les clés, mais si aucun programme n'est exécuté ou si le programme ne capture pas d'entrée, ce que l'on tape est inséré dans le shell après l'apparition de l'invite.
Par exemple :tapez sleep 5
, appuyez sur Entrée, puis tapez ls
et appuyez sur Entrée. ls
sera exécuté après la fin du sommeil. Dans la vraie vie, ls
serait remplacé par cp
, rsync
ou de nombreux autres programmes.
Il s'agit d'une fonctionnalité Typeahead typique et c'est un gain de temps considérable lorsque vous savez à l'avance quoi taper.
C'est aussi très agréable car cela permet de copier-coller plusieurs commandes et de les exécuter en séquence.
Les cas d'utilisation réels incluent le moment où le shell prend du temps à s'initialiser. Il se peut que l'ordinateur soit ralenti pour une raison quelconque, ou que le shell soit sur une liaison réseau lente, etc.
Recherche historique dans bash :bien
Sur une invite bash, on peut taper Ctrl-R
pour rechercher dans l'historique.
C'est un gain de temps inestimable lors de la réutilisation d'anciennes lignes de commande, voire d'une séquence de lignes de commande. Appuyez sur Ctrl-R
, tapez quelques caractères typiques de la commande à rechercher, appuyez sur Ctrl-O
autant de fois que nécessaire pour rejouer les commandes enregistrées à partir de là.
Tapez en amont dans la recherche d'historique :comment ?
Il y a cependant une limitation. J'utilise souvent la séquence ci-dessus et je trouve que si je tape par ex. Ctrl-R ls
avant que l'invite du shell n'apparaisse, le Ctrl-R
la partie est ignorée mais le ls
partie est affichée.
L'effet net est qu'il faut attendre que l'invite du shell apparaisse avant de taper Ctrl-R
, annulant une partie du temps gagné.
Question
Existe-t-il un moyen d'avoir Ctrl-R
honoré même dans une situation dactylographiée ?
Réponse acceptée :
Votre Ctrl –r est intercepté par le moteur de traitement des lignes de cookies du terminal basé sur le noyau.
Pendant sleep
est en cours d'exécution, le terminal est en mode cuit, ce qui signifie que l'éditeur de ligne tty basé sur le noyau fonctionne. L'éditeur de ligne tty prend en charge l'édition rudimentaire de la ligne de commande. La touche d'effacement (généralement définie sur Ctrl –h (retour arrière) ou Suppr ) et la touche kill (généralement Ctrl-U ) sont les touches d'édition spéciales les plus connues pouvant être utilisées dans ce mode. Cet éditeur de ligne est utile :c'est ce qui permet aux utilitaires interactifs qui n'utilisent ni readline ni curses de lire des lignes complètes d'entrée depuis le terminal tout en permettant à l'utilisateur de faire des corrections de frappe.
Mais il y a une autre touche spéciale qui est active dans ce mode. Vous pouvez le voir avec les autres paramètres clés dans la sortie de stty -a
sous le nom rprnt
et son paramètre par défaut est… vous l'avez deviné… Ctrl –r . La fonction de cette touche est de repeindre la ligne de commande actuelle, au cas où elle serait corrompue ou mal alignée en raison d'une autre sortie du terminal.
Pour éviter cela, vous pouvez désactiver la fonction avec stty rprnt undef
.
Personnellement, je suis habitué à Ctrl –r étant interprété comme une commande de repeinture et je suis surpris à chaque fois que j'essaie de le faire dans bash
et il fait quelque chose de différent !