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.

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 )


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.


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.


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.)


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.


6

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


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".


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).


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.


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


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.


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.


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


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.


Cette réponse peut faire avec plus d'explications.
Phunehehe
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.