web-dev-qa-db-fra.com

La meilleure façon de rechercher dans l'histoire de Shell

Existe-t-il un meilleur moyen de rechercher une commande dans mon fichier historique que grep? J'ai une idée de la façon dont la commande commence, mais je ne sais pas jusqu'où elle remonte.

mise à jour: é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)) ici, notez simplement s'il est spécifique.

82
xenoterracide

Ctrl+R est généralement le meilleur moyen, comme dit le descripteur . Vous pouvez aussi 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 la seule chose pertinente à cette question, mais j'ai couvert beaucoup plus de commandes d'historique dans cette réponse )

78
Michael Mrozek

Lorsque vous utilisez Bash, saisissez Control-R puis commencez à taper. Dactylographie Control-R à plusieurs reprises après avoir saisi du texte, vous reviendrez dans les lignes de commande correspondantes.

32
grendel

Je ne sais pas si cela vous aidera, mais j'aime utiliser ctrl-r puis commencez à taper la commande. Il devrait parcourir votre historique et vous présenter le premier match. Pour basculer entre les matchs, appuyez simplement sur ctrl-r encore.

18
decriptor

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 Up et Page Down pour reculer et avancer dans l'historique des lignes en commençant par le même préfixe que vous venez de taper.

(Certains peuvent préférer utiliser \e[A et \e[B, qui remplacera la normale Up et Down actions au lieu de lier de nouvelles clés.)

17
ephemient

L'invite interactive invoquée par Ctrl-R, qui avait déjà été mentionné, est le moyen le plus pratique. De plus, il est populaire de remapper Up et Down touches fléchées pour rechercher dans l'historique un préfixe actuellement sur la ligne de commande, mais cela nécessite quelques modifications de la ~/.inputrc fichier .

La solution classique et moins interactive consiste à utiliser l'expansion de l'historique de Shell. Dactylographie

!foo

exécutera la dernière commande commençant par foo et

!?foo

exécutera la dernière commande contenant foo. Plus d'informations sur l'expansion de l'historique peuvent être trouvées dans le Manuel de référence Bash , en supposant que votre Shell est Bash ou compatible.

9
Adam Byrtek

Si vous ajoutez stty -ixon à ton ~/.bashrc fichier puis Ctrl-s ira dans la direction opposée à Ctrl-r.

Si vous tapez !ls alors bash parcourra votre historique et exécutera la commande la plus récente commençant par "ls"

3
Kevin M

peut être spécifique à zsh. En recherchant cette réponse I trouvévi-history-search-backward qui permet de rechercher avec / en mode vi (dont je n'ai pas mentionné que j'étais), vous pouvez ensuite utiliser n et N pour rechercher respectivement en avant et en arrière (après avoir appuyé sur enter).

2
xenoterracide

Je suis surpris que cela n'ait pas été mentionné - mais vous pouvez sélectionner vi-mode en bash ou ksh en faisant ceci:

set -o vi

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

set editing-mode vi

Ensuite, vous pouvez utiliser Esc pour entrer mode commande et utiliser k pour revenir dans l'histoire, et j Aller de l'avant. Vous pouvez également rechercher en utilisant / pour rechercher normalement, et ? pour rechercher en sens inverse.

Si tu utilises ~/.inputrc, alors cela fonctionnera non seulement dans GNU bash mais dans tout ce qui utilise GNU readline comme CLISP et éventuellement des programmes comme la commande MySQL Shell et comme le CPAN Shell.

2
Mei

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 ~/.bashrc ou . ~/.bashrc

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

Travailler sur Ubuntu 18.04 LTS

2
Franklin TCHATATH

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

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

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

1
Hemant

Il existe un moyen d'utiliser Ctrl-R avec tcsh. Ajoutez ce qui suit dans votre ~/.cshrc:

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

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

1
Alain

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 la flèche 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 ne récupérer que votre ~/.bashrc alors que vous devez accrocher cela ~/.inputrc

1
Matt S.

Oui, il existe, du moins si vous utilisez zsh. Commencez simplement à taper la commande, puis appuyez sur M-p (ESCp) et il trouvera les commandes précédentes qui correspondent à ce que vous avez tapé. Appuyez à nouveau pour trouver le match suivant.

0
dkagedal