GNU/Linux >> Tutoriels Linux >  >> Linux

Comment faire en sorte que la saisie anticipée s'applique à la recherche dans l'historique de Bash (ctrl-r) ?

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 Ctrlr 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 Ctrlh (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.

Connexe :Comment rechercher une base de données MySQL avec des champs cryptés ?

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é… Ctrlr . 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é à Ctrlr é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 !


Linux
  1. Comment utiliser les commandes d'historique de Bash

  2. Comment effacer une commande spécifique de l'historique Bash sous Linux

  3. CentOS / RHEL :Comment désactiver l'historique du shell BASH

  4. Comment désactiver la modification de mon historique dans bash

  5. Comment exécuter une commande plusieurs fois à l'aide du shell bash ?

McFly - Un remplacement de la fonction de recherche d'historique Bash 'Ctrl + R'

Comment afficher l'historique de Bash sans numéros de ligne

Comment activer l'horodatage dans l'historique de Bash sous Linux

Comment utiliser la commande Declare dans Linux Bash Shell

Utilisation de la fonctionnalité d'historique sur Bash Shell sur le serveur Ubuntu 16.04 LTS

Comment exécuter une commande dans un script shell ?