Meilleur moyen de rechercher dans l'historique du shell

78

Existe-t-il un meilleur moyen de rechercher une commande dans mon fichier d’historique que grep? J'ai une idée de ce que la commande commence par, mais je ne sais pas à quel point elle est dans l'histoire.

update: était auparavant spécifique à zsh mais en raison du chevauchement des réponses, n'hésitez pas à répondre pour n'importe quel shell (ou mode (vi / emacs)), notez simplement s'il est spécifique.

xénoterracide
la source

Réponses:

73

Ctrl+ Rest généralement le meilleur moyen, comme dit le descripteur . Vous pouvez également utiliser !string, qui exécute la commande la plus récente commençant par string, ou !?string?, qui exécute la commande la plus récente qui contient string.

(Je pense que c'est le seul élément pertinent pour cette question, mais j'ai couvert beaucoup plus de commandes d'historique dans cette réponse )

Michael Mrozek
la source
4
comment faites-vous la "ctrl + r" ressemble à ça?
xenoterracide
13
@xen <kbd>Ctrl+R</kbd>. source réponse
Michael Mrozek
Je n'avais pas réalisé que le moteur SE acceptait les remerciements html.
xenoterracide
Je ne savais pas que le mot clé kbd interpréterait correctement les "ctrl" et "+"! J'avais l'habitude de marquer chaque clé séparément. Merci!
Olivier Dulac
2
@OlivierDulac Malheureusement, ce n'est pas comme ça que je formais les clés; quelqu'un a modifié ma réponse plus tard pour les séparer
Michael Mrozek
30

Lorsque vous utilisez Bash, tapez Control- Rpuis commencez à taper. En tapant Control- à Rplusieurs reprises après avoir saisi du texte, vous reviendrez dans les lignes de commande correspondantes.

Grendel
la source
18

Je ne sais pas si cela aidera, mais j'aime bien utiliser ctrl- rpuis commencer à taper la commande. Il devrait passer en revue votre historique et vous présenter le premier match. Pour passer à travers les matchs vient de frapper ctrl- à rnouveau.

décrypteur
la source
2
Désolé, j'ai oublié le zsh. Vous devrez peut-être ajouter ce raccourci clavier à votre ~ / .zshrc: bindkey '^ R' historique-recherche-arrière-incrémentielle
decriptor
17

Si vous ajoutez ce qui suit à ~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

et redémarrez Bash, vous pouvez commencer à taper, puis utiliser Page Upet Page Downpour avancer et reculer dans l’historique des lignes commençant par le même préfixe que celui que vous venez de taper.

(Certains préféreront peut-être utiliser \e[Aet \e[Bqui remplacera l'action normale Upet les Downactions au lieu de lier de nouvelles clés.)

éphémère
la source
Je préfère mapper ces commandes à Alt + Upet Alt + Down. En fonction de l'émulation du clavier du Emuler terminal utilise ces combinaisons peuvent être mises en correspondance soit \E[Aet \E[A(par exemple KDE Konsole avec Linux Key Bindings) ou \E[1;3Aet \E[1;3B(par exemple XFCE Terminal ou KDE Konsole avec X gratuit 4 Liaisons).
Christian Herenz
9

L'invite interactive appelée par Ctrl- R, qui a déjà été mentionnée, est le moyen le plus pratique. De plus, il est courant de remapper Upet d' utiliser les Downtouches de direction pour rechercher dans l'historique un préfixe actuellement en ligne de commande, mais cela nécessite quelques modifications dans le ~/.inputrcfichier .

La solution classique et moins interactive consiste à utiliser l'extension de l'historique du shell. Dactylographie

!foo

exécutera la dernière commande qui commence par fooet

!?foo

exécutera la dernière commande qui contient foo. Vous trouverez plus d'informations sur le développement de l'historique dans le manuel de référence de Bash , en supposant que votre shell soit compatible ou avec Bash.

Adam Byrtek
la source
6

Si vous ajoutez stty -ixonà votre ~/.bashrcfichier alors Ctrl- sira dans la direction opposée à Ctrl- r.

Dennis Williamson
la source
Je voulais utiliser C-sà cette fin, mais mon terminal a été gelé ; il faut se méfier! (Eh bien, je n'en ai pas encore employé, je stty ixonne sais pas à quoi ça sert.)
imz - Ivan Zakharyaschev Le
3
@imz: C-qva "dégeler". Ce C-ssont les caractères de contrôle de flux logiciels habituels qui étaient autrefois utiles pour interrompre manuellement (mettre en pause) le flux de sortie lorsque des connexions série lentes étaient utilisées. La sortie est maintenant si rapide dans la plupart des cas que ce que vous voulez voir lorsque vous appuyez sur C-sa déjà défilé. stty -ixondésactive le contrôle de flux logiciel.
Dennis Williamson
Fantastique! J'ai cherché pendant des années un moyen de faire défiler une histoire comme celle-ci.
Mars
3

Si vous tapez, !lsbash examinera votre historique et exécutera la commande la plus récente commençant par "ls".

Kevin M
la source
2

pourrait être spécifique à zsh. En cherchant cette réponse, j'ai trouvé vi-history-search-backward ce qui permet de chercher /en mode vi (dans lequel je n'avais pas mentionné que j'étais en), vous pouvez ensuite utiliser net Npour rechercher en avant et en arrière respectivement (après avoir appuyé sur enter).

xénoterracide
la source
2

Je suis surpris que cela n'ait pas été mentionné - mais vous pouvez sélectionner vi-mode dans bash ou ksh en procédant comme suit:

set -o vi

... ou en utilisant ceci comme contenu de ~/.inputrc(pour GNU readline utilisé dans des programmes tels que bash):

set editing-mode vi

Ensuite, vous pouvez Escentrer en mode commande et krevenir en arrière dans l’historique et jaller de l’avant. Vous pouvez également rechercher en utilisant /pour rechercher normalement et ?inversement.

Si vous utilisez ~/.inputrc, cela fonctionnera non seulement dans GNU bash, mais dans tout ce qui utilise GNU readline, tel que CLISP et éventuellement des programmes tels que le shell de commandes MySQL et le shell CPAN.

Mei
la source
2

Pour basculer vers l'avant lorsque vous utilisez la recherche inversée (avec la commande Ctrl-R):

  1. Ouvrez votre fichier .bashrc:
    sudo gedit ~/.bashrc

  2. ajouter cette ligne (la lettre "f" peut être remplacée par une autre non encore utilisée par le système)

    bind '"\C-f": forward-search-history' 
  3. Fermez votre fichier et mettez à jour votre .bashrc (ou ouvrez un autre terminal) avec la commande:
    source ~/.bashrcou. ~/.bashrc

MAINTENANT, VOUS POUVEZ AVANCER DANS L'HISTOIRE AVEC LE RACCOURCI: Ctrl + f

Travailler sur Ubuntu 18.04 LTS

Franklin TCHATATH
la source
1

J'utilise les deux suivants la plupart du temps.
Mais notez bien que les deux recherchent des caractères de départ.

  1. tcsh : tapez quelques caractères de la commande puis Esc+ pil affichera la commande précédente en commençant par cette séquence de touches, appuyez de nouveau dessus pour afficher une autre commande.
  2. ksh : use fc -e - <SPACE> <first few char for your previous >cela lancera la dernière commande correspondant à cette séquence.

Je n'ai pas pu trouver quelque chose comme Ctrl+ Rdans Bash pour mon ksh et mon tcsh.

Hemant
la source
3
Ctrl + r fonctionne un peu différemment en ksh que Bash. Appuyez sur Ctrl + r puis tapez la chaîne que vous recherchez et appuyez sur Entrée . Pour rechercher la même chose, appuyez sur Ctrl + r et entrez sans avoir à ressaisir la chaîne. C'est en set -o emacsmode, au fait.
Dennis Williamson
@Dennis: +1 :-)
Hemant
1

Il y a un moyen d'utiliser Ctrl- Ravec tcsh . Ajoutez ce qui suit dans votre ~/.cshrc:

bindkey "^r" i-search-back (c'est juste un signe de signe et la lettre r)

C'est le plus grand gain de temps pour moi.

gros nez
la source
1

réponse similaire à @ephemient, mais vous pouvez mettre dans votre .bashrc

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-foward'

et tapez une partie de la phrase, puis utilisez les flèches haut / bas pour parcourir les options les plus récentes qui correspondent. C'est le comportement par défaut de matlab.

Pour la plupart des gens, si vous souhaitez transférer vos paramètres vers un nouveau système, il est plus facile de vous rappeler de vous accrocher juste votre ~/.bashrcalors que cela vous devez accrocher que~/.inputrc

Matt S.
la source
0

Oui, cela existe, du moins si vous utilisez zsh. Il suffit de commencer à taper la commande, puis d'appuyer sur M-p( ESC p) pour trouver les commandes précédentes qui correspondent à ce que vous avez tapé. Appuyez à nouveau pour trouver le prochain match.

dkagedal
la source
Cette réponse peut faire avec plus d'explications.
Phunehehe