2009-07-17 19:23:49 +0000 2009-07-17 19:23:49 +0000
302
302

Comment puis-je effectuer une recherche dans l'historique des bashs et relancer une commande ?

Puis-je rechercher l'historique dans bash et lancer le résultat ?

Réponses (10)

38
38
38
2009-07-17 20:40:32 +0000

Comme alternative à crtl+R, vous pouvez rechercher l'historique en tapant

!text

Cela permettra de rechercher dans l'historique la commande la plus récente débutant par “texte”.

Mais je vous suggère de mettre ceci dans votre .bashrc pour éviter l'exécution d'une mauvaise commande.

shopt -s histverify

Ceci indique à bash que, après toute action dans l'historique (comme !!:s/prev_text/after_text), il place la ligne résultante à l'invite de commande. Vous pouvez ensuite revoir ou modifier la commande, et appuyer sur la touche Entrée.

33
33
33
2009-07-17 20:21:39 +0000

Vous pourriez aussi faire :

history | grep "stuff"

cela donnerait quelque chose comme

num stuff

puis vous pouvez taper

!num
```.
16
16
16
2011-02-02 20:32:12 +0000

Je préfère utiliser la recherche historique à rebours plutôt que la recherche historique inverse. La première permet de taper quelques caractères de la commande puis d'appuyer sur la touche de recherche, par opposition à la touche de recherche d'abord puis à la chaîne de recherche.

Par défaut sur mon système, M-p et M-n se lient à des fonctions similaires mais je préfère lier les touches fléchées :

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
13
13
13
2014-09-25 16:45:14 +0000

J'ai un très bon alias, h. C'est vraiment juste “history | grep”, mais je filtre les entrées précédentes de la “commande h” avec le “grep -E -v”

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

utilisé comme

h aliases
2003 less .bash_aliases
12
12
12
2009-09-10 14:23:48 +0000

Excellente rédaction, Sean ! Je le mettrais bien dans un commentaire, mais je suis un peu timide sur le plan de la réputation :-)

Une autre technique connexe et utile est la possibilité d'exécuter une commande précédente tout en changeant un mot. Supposons que vous ayez fait une faute de frappe dans le nom du répertoire, ou que vous vouliez changer le nom du fichier :

$ echo my name is bob my name is bob $ ^bob^jordan echo my name is jordan my name is jordan

Remarquez que la commande est développée, remplacée et affichée avant que la commande ne soit exécutée, donc si la mauvaise commande est exécutée, vous pouvez voir ce que Bash pensait qu'elle faisait.

6
6
6
2014-12-18 16:37:14 +0000

Comme la navigation dans l'historique en utilisant Ctrl-r est lourde à l'OMI, vous pouvez envisager hh : https://github.com/dvorka/hstr

qui rend la navigation beaucoup plus simple, directe et efficace - y compris l'exécution de la commande :

4
4
4
2014-09-04 04:55:04 +0000

À l'invite de commande de bash, tapez control-R, puis tapez quelques caractères de la commande que vous voulez et la fonction de ligne de lecture de bash recherchera cette commande dans l'historique des commandes.

Après avoir lancé la recherche, vous pouvez taper à nouveau control-R pour passer à la commande suivante qui correspond.

3
3
3
2015-11-22 15:21:56 +0000

Si votre shell est configuré pour utiliser les raccourcis clavier vi (set -o vi ou avoir set editing-mode vi dans $HOME/.inputrc), alors vous cherchez avec <Esc>/some-command<Return> et appuyez sur n (suivant) ou Shift-n (précédent) pour parcourir l'historique de la ligne de commande.

2
2
2
2014-09-04 05:11:10 +0000

CTRL+R fonctionne très bien, comme le suggère @John1024, mais est quelque peu fastidieux si beaucoup de vos commandes récentes sont similaires et que vous voulez un moyen rapide de toutes les analyser. Une alternative serait d'utiliser history :

$ history | grep keyword
``` :
0
0
0
2019-05-22 13:17:52 +0000

J'aime le HSTR, mais il m'arrive de ne pas pouvoir l'installer. J'ai donc écrit un alias en utilisant fzf qui imite son comportement (hx, pour “history execute”)

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : bien, obtenir l'historique
  • sed : supprimer la colonne de chiffres de la liste (POSIX)
  • fzf : voici la magie, qui permet de faire une recherche floue dans la liste de manière interactive, ou de se déplacer avec C-J et C-K, puis d'exécuter une commande avec Enter.
  • --height : permet de définir le nombre de lignes affichées.
  • --tac : retourner la liste (plus logique pour un historique)
  • --tiebreak=index : garder l'ordre de l'historique lorsque fzf met à jour les résultats