web-dev-qa-db-fra.com

Existe-t-il un moyen d'exécuter des commandes à partir de l'historique?

Par exemple:

[root@ip-10-0-7-125 ~]# history | grep free
  594  free -m
  634  free -m | xargs | awk '{print "free/total memory" $17 " / " $ 8}'
  635  free -m
  636  free -m | xargs | awk '{print "free/total memory" $9 " / " $ 10}'
  736  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $9}'
  740  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $8}'
  741  free -m | xargs | awk '{print "free/total memory: " $17 " / " $8 " MB"}'

Je me demande simplement s'il existe un moyen d'exécuter la commande 636 sans la taper à nouveau, il suffit de taper quelque chose plus le nombre, comme l'historique 636 ou quelque chose.

111
The One

En bash, juste !636 sera OK.

193
user164825

Oui, cela s'appelle "expansion de l'histoire". Voir

LESS='+/^HISTORY EXPANSION' man bash

pour plus de détails.

L'utilisation d'un point d'exclamation suivi d'un nombre est sans doute l'utilisation la plus simple:

!636

Cependant, vous pouvez également exécuter directement la dernière commande exécutée sans connaître son numéro d'historique:

!!

Ou vous pouvez exécuter deux commandes en arrière:

!-2

La forme que j'utilise le plus souvent, cependant, est de répéter le dernier argument de la dernière commande:

echo this text goes into a file > /tmp/afile.txt
cat !$

Ou, disons que j'inspecte un fichier. En utilisant la complétion d'onglet, je pourrais faire ce qui suit:

ls -l /really/long/path/to/some/file
less !$

Encore une fois, lire la page de manuel pour plus de détails:

LESS='+/^HISTORY EXPANSION' man bash
80
Wildcard

Un joli, si vous ne voulez pas faire un premier historique, notez le numéro, etc:

en bash (et peut-être d'autres):

ctrl-r something 

(ctrl-r = "recherche inversée interactive") (something = une partie d'une commande précédente)

Cela vous montrera la dernière ligne d'historique contenant something. Pour obtenir celui d'avant, refaites ctrl-r (seul), chaque fois qu'il obtient une ligne précédente.

ex:

ctrl-r  10

pour afficher la dernière ligne d'historique contenant '10' (par exemple la ligne avec $10, dans votre exemple), et ctrl-r jusqu'à ce que vous récupériez la ligne d'historique que vous cherchiez

Lorsque la ligne souhaitée apparaît, il suffit de Enter pour l'exécuter (ou vous pouvez également la modifier en utilisant le arrow keys, backspace et ctrl-a pour aller au début de la ligne, ctrl-e pour arriver à la fin, ctrl-k: pour "tuer" du curseur à la fin de la ligne (= supprime + l'enregistre dans un tampon), ctrl-y: pour restaurer, à partir du tampon, un bit précédemment tué, etc.)

Si vous souhaitez rechercher en avant (ctrl-s), vous devez d'abord désactiver XON : voir https://stackoverflow.com/ a/791800/18415 :

"juste pour désactiver XON/XOFF en exécutant

stty -ixon

"(et ensuite vous pourrez utiliser ctrl-s, sans le faire figer le terminal)

14
Olivier Dulac

Vous pouvez utiliser le shell intégré fc:

fc -s 636
8
Steven Penny

Il y a HSTR - hh commande pour bash et zsh sélection de commande interactive, meilleure que la recherche inversée Ctrl-R:

hh interactive history command example

son interactif, de sorte que vous pouvez rechercher et modifier la commande, avant de l'exécuter.

Sur Ubuntu, vous pouvez installer hh avec le one-liner suivant:

Sudo add-apt-repository ppa:ultradvorka/ppa && Sudo apt-get update && Sudo apt-get install hh && hh --show-configuration >> ~/.bashrc

ou pas à pas:

Sudo add-apt-repository ppa:ultradvorka/ppa
Sudo apt-get update
Sudo apt-get install hh

Installez hh sur Fedora, RHEL ou CentOS:

Sudo dnf|yum install hstr -y

Sur macOS avec homebrew:

brew install hh

... puis configurez-le avec:

hh --show-configuration >> ~/.bashrc

Cela remplacera le comportement Ctrl-R par défaut.

Courir hh --show-configuration pour déterminer ce qui sera ajouté à votre profil Bash.

Plus d'options de configuration disponibles sur la page d'accueil du projet sur Github: https://github.com/dvorka/hstr

3
modlin