360 votes

Comment puis-je rechercher dans l'historique de bash et réexécuter une commande ?

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

521voto

Type Ctrl R à la ligne de commande et commencez à taper la commande précédente. Dès qu'un résultat apparaît, continuez à taper Ctrl R pour voir d'autres correspondances. Lorsque la commande souhaitée apparaît, il suffit d'appuyer sur Enter

Notez que si Ctrl R est la valeur par défaut, si vous vouliez que la commande ( reverse-search-history ) à lier à Ctrl T vous pourriez configurer cela avec ce qui suit :

bind '"\\C-t": reverse-search-history'

Il existe toute une série d'autres commandes liables à readline qui sont également à votre disposition. Jetez un coup d'œil à la bash page de manuel .

Bash dispose de nombreuses possibilités pour rechercher et accéder à l'historique des commandes interactives. La plus simple d'entre elles est la fonction history intégré. Taper juste :

$ history

Imprime une liste de commandes avec un index numérique, par exemple :

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

Vous pouvez ensuite exécuter n'importe laquelle de ces commandes en utilisant leur index numérique en faisant précéder l'index d'un simple ! comme Mitch a souligné :

$ !1

Exécutera le clear commande. Le module d'historique a lui-même de nombreuses fonctionnalités, vous pouvez en voir plus dans la section bash y history pages du manuel.

Vous pouvez également spécifier des décalages négatifs relatifs lorsque vous utilisez la commande ! donc, en utilisant notre liste d'historique ci-dessus, si nous voulions exécuter vim encore une fois, nous pourrions le faire :

$ !-2

Ce qui revient à dire à bash d'exécuter la commande que vous avez lancé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 juste un raccourci pour !-1 ).

El ! ne vous limite pas à spécifier numériquement la commande à exécuter. hayalci a montré que vous pouvez instruire bash pour exécuter une commande en se basant sur le texte par lequel elle commence (avec l'option ! ) ou du texte dans la commande elle-même (en utilisant !? ). De nouveau, en utilisant notre exemple de liste d'historique ci-dessus, si nous voulions exécuter clear à nouveau, il suffit de taper :

$ !cl

et appuyez sur Enter . Et qu'en est-il vim ? C'est aussi simple que cela :

$ !?some

Le point le plus important de hayalci La réponse de l'entreprise est l'appel à la shopt builtin :

$ shopt -s histverify

Cela activera la vérification de l'historique, de sorte que les commandes correspondant à l'option ! , !! et !? Les désignateurs ne sont pas exécutés aveuglément, mais remplis sur la ligne de commande afin que vous puissiez vous assurer qu'ils 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 .bashrc afin qu'il soit défini à chaque fois que vous vous connectez.

Comme on l'a déjà souligné, toutes ces informations peuvent être glanées dans la base de données de la Commission européenne. bash page de manuel . Pour les indicatifs !, ! !, et ! ?, consultez la section 9.3 Expansion historique .

45 votes

+1 J'utilise Linux depuis plus de 12 ans pour tous les systèmes. Je ne savais pas que cela existait. J'aimerais pouvoir +10 comment ai-je pu le manquer ?

1 votes

Sur de nombreux systèmes, appuyer sur la flèche vers le haut fait la même chose.

0 votes

Si quelqu'un devait consolider '!!', '!!', '!?', 'history | grep', et 'ctrl-r' dans une réponse complète, je la sélectionnerais.

51voto

Billy Coover Points 183

Vous pouvez aussi le faire :

history | grep "stuff"

il retournerait quelque chose comme

num stuff

alors vous pouvez taper

!num

0 votes

39voto

Martin Points 15155

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

!text

Ceci recherchera dans l'historique la commande la plus récente. débutant avec "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 tout les actions de l'histoire (comme !!:s/prev_text/after_text ), il place la ligne résultante à l'invite de commande. Vous pouvez alors revoir ou modifier la commande, puis appuyer sur Entrée.

5 votes

Utilisez !?text pour réexécuter la commande la plus récente contenant (et non commençant par) "text".

3 votes

Si quelqu'un devait consolider '!!', '!!', '!?', 'history | grep', et 'ctrl-r' dans une réponse complète, je la sélectionnerais.

19voto

Keith Points 291

Je préfère utiliser history-search-backward plutôt que reverse-search-history. La première vous permet de taper quelques caractères de la commande puis appuyer sur la touche de recherche, plutôt que 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 fléchées :

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

13voto

greenwar Points 513

Excellent article, Sean ! Je l'aurais bien mis dans un commentaire, mais il me manque quelques points de réputation :-)

Une autre technique connexe et utile est la possibilité d'exécuter une commande précédente tout en modifiant un mot. Disons que vous avez fait une faute de frappe dans le nom du répertoire, ou que vous voulez 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. Ainsi, si une mauvaise commande est exécutée, vous pouvez voir ce que bash pensait faire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X