Est-il possible d'exécuter des commandes de l'historique?

99

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 est possible d’exécuter la commande 636 sans la retaper, il suffit de taper quelque chose en plus du numéro, comme l’historique 636 ou quelque chose du genre.

Celui
la source
14
connaissez-vous ctrl-r?
Carlos Campderrós
1
Oui, je le sais, mais ce n'est pas exactement ce que je veux.
Le One

Réponses:

171

En bash, tout !636ira bien.

utilisateur164825
la source
12
In Linux- Cela a plus à voir avec le shell (bash, zsh, etc.) une personne est en cours d'exécution, puis le système d'exploitation sur lequel vous l'exécutez. Il y a des shells sur linux sans support pour l'histoire.
Zoredache
@Zoredache Et de même, cela fonctionne très bien dans la plupart des implémentations de bash sous Windows.
Ajedi32
1
Pas seulement bash, bien sûr, mais aussi d'autres obus - y compris csh.
Drew
5
Si vous avez une commande très similaire à celle que vous voulez exécuter, vous pouvez l'ajouter :ppour imprimer la commande sans l'exécuter, !636:ppar exemple. Ce qui signifie que vous pouvez facilement le sélectionner à nouveau dans votre historique en appuyant sur la flèche vers le haut et en
effectuant
78

Oui, cela s'appelle "l'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 la plus simple des utilisations:

!636

Toutefois, 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:

!-2

Le formulaire que j’utilise le plus souvent consiste toutefois à 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 par tabulation, je pourrais procéder comme suit:

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

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

LESS='+/^HISTORY EXPANSION' man bash
Wildcard
la source
25
Interactivement, Alt-.peut être plus pratique que !$. Il insère le dernier argument de la dernière commande mot pour mot dans la ligne.
ulidtko
2
@ulidtko Où ces échappées spéciales sont-elles documentées (à ma connaissance !$, mais jamais à ma connaissance Alt-.)? Voulez-vous poster un lien, s'il vous plaît?
Edmz
5
LESS="+/DEFAULT KEY BINDINGS" man 3 readline, /etc/inputrc, ~/.inputrc. De nombreux programmes en plus de bash utilisent libreadline; pour ceux qui le font, vous bénéficiez des mêmes fonctionnalités telles que Alt-., Ctrl-X-U(annuler), Ctrl-/(décrire le raccourci), compléter la tabulation, etc. - gratuitement. Par exemple, avec seulement trois lignes d’ PYTHONSTARTUPune ligne, vous pouvez activer l’achèvement de la tabulation et l’historique dans le stock REPL python . Ce qui fonctionnera (principalement) comme dans bash, puisque c’est la bibliothèque GNU Readline qui fait le travail. La page de manuel de readline décrit les fonctionnalités en détail.
ulidtko
2
En outre, Ctl-UpArrow (ou AltUpArrow on bash) fera défiler la liste d'historique vers l'arrière. En entrant quelques caractères, UpArrow n'obtient que les commandes commençant par cette lettre, par exemple "fr (Ctl-Up)" fait défiler toutes les commandes "free ..." de la liste de l'OP. Cela fonctionne aussi dans des choses comme gnuplot & gdb qui utilisent readline.
jamesqf
2
@ Ajedi32, voir la dernière ligne en gras dans ma réponse. :) Honnêtement, cette réponse est à peine un avant-goût de ce que l'expansion de l'histoire peut faire . N'oubliez pas que c'est au niveau du shell, pas de la commande que vous appelez. donc echo {1..5}suivi par touch !$touchera cinq fichiers, pas un seul. Donc, à proprement parler, ce n'est pas le dernier argument mais le dernier mot shell de cette ligne. (Essayez également echo hello >tempsuivi de echo goodbye !$.) Si vous pouvez trouver un moyen de le dire plus clairement, n'hésitez pas à suggérer une modification.
Wildcard
14

Un bon, si vous ne voulez pas d'abord l'histoire, notez le numéro, etc:

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

ctrl-r something 

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

Cela vous montrera la dernière ligne d'historique contenant something. Pour obtenir celui qui précède, faites à nouveau 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 de ctrl-rnouveau jusqu'à ce que vous récupériez la ligne d'historique que vous recherchiez

Lorsque la ligne que vous voulez apparaître, juste Enterpour l' exécuter (ou vous pouvez également le modifier, en utilisant le arrow keys, backspaceet ctrl-ad'aller au début de la ligne, ctrl-epour se rendre à la fin, ctrl-k: « tuer » du curseur jusqu'à la fin de la ligne (= supprime + l'enregistre dans un tampon),: ctrl-ypour restaurer, à partir du tampon, un bit précédemment tué, etc.)

Si vous souhaitez effectuer une recherche en avant (ctrl-s), vous devez d’abord désactiver XON : voir https://stackoverflow.com/a/791800/1841533 :

"juste pour désactiver XON / XOFF en lançant

stty -ixon

"(et vous pourrez alors utiliser ctrl-s, sans que cela gèle le terminal)

Olivier Dulac
la source
Si je fais cela et que j'appuie accidentellement sur ctrl-r une fois de trop, existe-t-il un moyen de rechercher à nouveau dans l'historique?
Kasperd
@ Kasperd: Oui, vous le pouvez. de nombreuses réponses sur se le font remarquer: ctrl-s pour la recherche en avant.
Olivier Dulac
Malheureusement, ctrl-s est utilisé pour geler le terminal, et bash ne le désactive pas, donc cela ne fonctionne pas dans la configuration par défaut. (D'autres programmes, tels que emacs, désactivent la liaison au clavier pour geler le terminal, de sorte que ctrl-s puisse être utilisé pour la recherche.)
kasperd
@ kasperd: Oui, désolé de ne pas avoir mentionné cela plus tôt (j'ai indiqué "beaucoup de réponses" parce qu'elles le précisent, mais je n'ai pas pris le temps de le taper dans le commentaire ou de donner un lien ... (j'utilisais ma Je viens de rentrer à la maison et je peux le modifier dans la réponse ci-dessus. ctrl-s pour la recherche d’histoire bash a besoin de vous pour stty -ixon d’abord
Olivier Dulac
Cette commande va interrompre l'utilisation normale de ctrl-s, ce n'est donc pas vraiment une option.
Kasperd
7

Vous pouvez utiliser le shell intégré fc :

fc -s 636
Steven Penny
la source
2
C'est en fait mieux que la réponse acceptée, mais vous devez supprimer le -spour obtenir les avantages. Si vous exécutez, fc 636vous ouvrez un éditeur avec la commande 636 de votre historique dans la mémoire tampon. Lorsque vous enregistrez et quittez la commande, celle-ci (modifiée ou non) sera exécutée. Et encore mieux, celui-ci est compatible POSIX .
Wildcard
@StevenPenny Merci. Et oui, je sais ce que POSIX est, bien que je ne voie pas la pertinence. Quoi qu'il en soit, une documentation facilement accessible et incluse serait bien.
Faheem Mitha
@FaheemMitha essayez de lancer "help fc".
Wildcard
@Wildcard helpn'est pas POSIX - pourrait avoir à faire man dashou similaire
Steven Penny
@Wildcard Merci. J'ai tendance à oublier helpexiste. Un autre shell intégré. Et déroutant pour les utilisateurs non avertis qui pourraient demander de l’aide pour un nouveau système, mais qui sont au contraire confrontés à un flot de charabia. :-(
Faheem Mitha
3

Il existe HSTR- hhcommande pour bashet zshsélection de commande interactive, meilleure que la recherche inversée Ctrl-R:

hh exemple de commande d'histoire interactive

interactive, vous pouvez donc rechercher et modifier la commande avant de l’exécuter.

Sur Ubuntu, vous pouvez installer hhavec 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

Installer hhsur 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 par défaut Ctrl-R.

Exécuter hh --show-configurationpour 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

modlin
la source