web-dev-qa-db-fra.com

Comment rechercher dans l'historique bash et réexécuter une commande?

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

288
Richard Hoskins

Type CtrlR sur la ligne de commande et commencez à taper la commande précédente. Une fois qu'un résultat apparaît continue de frapper CtrlR pour voir d'autres allumettes. Lorsque la commande souhaitée apparaît, appuyez simplement sur Enter

Notez que tandis que CtrlR est la valeur par défaut si vous voulez que la commande (reverse-search-history) soit liée à CtrlT vous pouvez configurer cela avec ce qui suit:

 bind '"\ C-t": historique de la recherche inversée' 

De nombreuses autres commandes lisibles readline sont également disponibles. Jetez un coup d’œil à la page de manuel bashNAME_ .

Bash dispose de nombreuses fonctionnalités pour rechercher et accéder à l'historique des commandes interactives. Le plus fondamental est le nom intégré historyname__. Taper juste:

 $ histoire 

Imprimera une liste de commandes avec un index numérique, tel que:

 $ history 
 1 clear 
 2 ls -al 
 3 vim ~/quelquefichier.txt 
 4 historique 
 $ 

Vous pouvez ensuite exécuter n'importe laquelle de ces commandes en utilisant leur index numérique en préfacant l'index avec un seul !, comme Mitch a souligné:

 $! 1 

Exécute la commande clearname__. L'historique intégré a de nombreuses fonctionnalités, vous pouvez en voir plus dans les pages de manuel bashet historyname__.

Vous pouvez également spécifier des compensations négatives relatives lorsque vous utilisez l'indicateur !. Ainsi, en utilisant notre liste d'historique ci-dessus, si nous voulions exécuter à nouveau vimname__, nous pourrions faire:

 $! -2 

Ce qui signifie fondamentalement que bash exécute la commande que vous avez exécutée "il y a deux commandes". Pour exécuter la commande précédente dans la liste de l'historique, nous pouvons simplement utiliser !! (qui est simplement un raccourci pour !-1).

L'indicateur ! ne vous limite pas à spécifier numériquement la commande à exécuter. hayalci a montré que vous pouvez demander à bashd'exécuter une commande en fonction du texte par lequel elle commence (en utilisant !) ou du texte de la commande elle-même (en utilisant !?). Encore une fois, en utilisant notre exemple d’historique ci-dessus, si nous voulions exécuter à nouveau clearname__, il nous suffirait de taper:

 $! cl 

et appuyez sur Enter. Et que dire de vimname__? C'est aussi simple que:

 $!? quelque 

Le point le plus important de la réponse de hayalci est l'appel à la variable shoptname__:

 $ shopt -s histverify 

Cela activera la vérification de l'historique afin que les commandes associées aux indicateurs !, !! et !? ne soient pas exécutées à l'aveuglette, mais complétées sur la ligne de commande afin de vous assurer qu'elles ne feront aucun mal avant de les exécuter. Ceci est encore plus important lorsque vous exécutez des commandes en tant qu'utilisateur root. Cette option peut être définie dans votre fichier de démarrage .bashrc de sorte qu'elle soit définie à chaque fois que vous vous connectez.

Comme il a déjà été souligné, toutes ces informations peuvent être extraites de la page de manuel bashNAME_ . Pour le!, !!, et!? voir les indications de la section 9.3 Extension de l’historique .

421
Sean Bright

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

!text

Ceci recherchera dans l'historique la commande la plus récente commençant par 'text'.

Mais je vous suggère de mettre cela dans votre .bashrc pour empêcher l'exécution d'une mauvaise commande.

shopt -s histverify

Ceci indique à bash que, après toutes les actions historiques (comme !!:s/prev_text/after_text), il place la ligne résultante dans la commande Invite. Ensuite, vous pouvez revoir ou éditer la commande et appuyer ensuite sur Entrée.

36
hayalci

Vous pouvez aussi faire:

history | grep "stuff"

il retournerait quelque chose comme

num stuff

alors vous pouvez taper

!num
30
Mitch

Je préfère utiliser l'historique-recherche-arrière sur l'historique de recherche inversée. Le premier vous permet de saisir quelques caractères de la commande puis et d’appuyer sur la touche de recherche au lieu d’appuyer d’abord sur la touche de recherche puis de taper 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 de direction:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
14
Keith

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

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

utilisé comme

h aliases
2003  less .bash_aliases
12
CurtH

Excellent article, Sean! Je mettrais cela dans un commentaire, mais je suis timide sur quelques points de réputation. :-)

Une autre technique connexe et utile est la possibilité d’exécuter une commande précédente en modifiant un mot. Supposons que vous avez tapé le nom du répertoire ou que vous vouliez changer le nom du fichier:

$ echo je m'appelle bob 
 mon nom est bob 
 $ ^ bob ^ jordan 
 echo je m'appelle jordan 
 je m'appelle jordan

Notez que la commande est développée, remplacée et sortie avant son exécution. Ainsi, si vous exécutez la mauvaise commande, vous pouvez voir ce que bash pensait en faire.

12
Jordan

La navigation dans l'historique à l'aide de la combinaison de touches Ctrl-r étant fastidieuse pour l'OMI, vous pouvez envisager de considérer hh:

https://github.com/dvorka/hstr

ce qui rend la navigation beaucoup plus simple, simple et efficace - y compris en exécutant la commande:

enter image description here

5
Martin Dvorak

À l'invite de commande bash, tapez control-R, puis tapez quelques caractères de la commande souhaitée et la fonction readline de bash effectuera une recherche dans l'historique de commande pour cette commande.

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

3
John1024

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

3
Fernando Basso

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

$ history | grep keyword
2
Mureinik