Question Comment rechercher l'historique de bash et relancer une commande?


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


271
2017-07-17 19:23


origine




Réponses:


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

Notez que tout en Ctrl  R est la valeur par défaut, si vous vouliez la commande (reverse-search-history) être attaché à Ctrl  T vous pouvez configurer cela avec les éléments suivants:

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

Il existe également toute une série d’autres commandes lisibles readline. Jetez un oeil à la bash page de manuel.

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

$ historique

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

$ historique
1 clair
2 ls -al
3 vim ~ / unfichier.txt
4 histoire
$

Vous pouvez ensuite exécuter l'une de ces commandes en utilisant leur index numérique en préfaçant l'index avec un seul !, comme Mitch souligné:

$! 1

Va exécuter le clear commander. L’histoire intégrée a de nombreuses fonctionnalités, vous pouvez en voir plus dans le bash et history pages de manuel.

Vous pouvez également spécifier des décalages négatifs relatifs lors de l’utilisation du ! désignateur, donc en utilisant notre historique ci-dessus, si nous voulions exécuter vim encore une fois, nous pourrions faire:

$! -2

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

le ! Le désignateur ne vous limite pas à spécifier numériquement la commande à exécuter. Hayalci montré que vous pouvez instruire bash pour exécuter une commande basée sur le texte qui commence par (en utilisant !) ou du texte dans la commande elle-même (en utilisant !?). Encore une fois, en utilisant notre liste d’exemples ci-dessus, si nous voulions exécuter clear encore une fois, il suffit de taper:

$! cl

et appuyez sur Entrer. Et à propos de vim? C'est aussi simple que:

$!? certains

Le point le plus important de HayalciLa réponse est l'appel à la shopt Builtin:

$ shopt -s histverify

Cela permettra la vérification de l'historique afin que les commandes correspondant à la !, !!, et !? les désignateurs ne sont pas exécutés à l'aveuglette, mais remplissent plutôt la ligne de commande pour 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 fichier de démarrage pour qu'il soit défini chaque fois que vous vous connectez

Comme cela a déjà été souligné, toutes ces informations peuvent être tirées de bash page de manuel. Pour le!, !!, et!? les désignateurs, jetez un oeil à la section 9.3 Extension de l'histoire.


390
2017-07-17 19:25



+1 J'utilise Linux depuis plus de 12 ans pour tous les systèmes. Je ne savais pas que ça existait. Je voudrais pouvoir +10 comment l'ai-je manqué ?? - Aiden Bell
Je ne l'ai pas découvert avant d'avoir commencé à utiliser régulièrement emacs. Puis je l'ai accidentellement tapé dans bash un jour (en pensant que j'étais dans emacs). - Sean Bright
Sur de nombreux systèmes, appuyer sur la flèche vers le haut fait la même chose. - mas
La flèche vers le haut pour moi va juste à la commande précédente. Mais oui, tout est lié à ce que vous voulez. - Sean Bright
Après avoir appuyé sur CTRL + R, vous pouvez également utiliser CTRL + MAJ + R plusieurs fois pour revenir à la commande précédente. - Gal Bracha


Au lieu de crtl + R, vous pouvez rechercher l'historique en tapant

!text

Cela recherchera l'historique de la commande la plus récente début avec 'texte'.

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

shopt -s histverify

Cela indique à bash tel que, après tout actions historiques (comme !!:s/prev_text/after_text), il place la ligne résultante à l'invite de commande. Ensuite, vous pouvez examiner ou modifier la commande, puis appuyer sur Entrée après.


34
2017-07-17 20:40



Utilisez!? Text pour ré-exécuter la commande la plus récente contenant (par opposition à commencer par) "texte". - mark4o
Si quelqu'un devait consolider '!', '!!', '!?', 'Histoire | grep ', et' ctrl-r 'dans une réponse complète, je le sélectionnerais. - Richard Hoskins


Vous pourriez aussi faire:

history | grep "stuff"

il retournerait quelque chose comme

num stuff

alors vous pouvez taper

!num

27
2017-07-17 20:21





Je préfère utiliser history-search-backward sur l'historique de recherche inversée. Le premier vous permet de taper quelques caractères de la commande puis appuyez sur la touche de recherche plutôt que sur la touche de recherche, puis tapez 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 relier les touches fléchées:

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

14
2018-02-02 20:32





Excellente rédaction, Sean! Je mettrais cela dans un commentaire, mais je suis un peu timide points de réputation. :-)

Une autre technique associée et utile est la possibilité d'exécuter une commande précédente tout en changeant un mot. Disons que vous avez tapé le nom du répertoire ou que vous voulez changer le nom du fichier:

$ echo je m'appelle bob
je m'appelle Bob
$ ^ bob ^ jordan
écho mon nom est Jordan
Mon nom est Jordan

Notez que la commande est développée, remplacée et sortie avant l'exécution de la commande. Par conséquent, si une commande incorrecte est exécutée, vous pouvez voir ce que bash pensait faire.


12
2017-09-10 14:23





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
2017-09-25 16:45



Cela peut également être accompli en ajoutant la commande à HISTIGNORE. - tanenbring


Comme la navigation dans l’historique à l’aide de Ctrl-r est encombrante, vous pouvez considérer hh:

https://github.com/dvorka/hstr

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

enter image description here


5
2017-12-18 16:37



Comment l'utiliser? Quelles touches appuyer pour voir cette image? - Nakilon
Une fois que vous avez installé hh, vous pouvez soit utiliser la commande hh, soit la relier à un raccourci clavier (généralement Ctrl-r), comme décrit dans la documentation. - Martin Dvorak
il se lie à ctrl + r par défaut maintenant - Alleo