Comment répéter la dernière commande sans utiliser les touches de direction?

115

Je sais que je peux utiliser Uppour parcourir les commandes précédentes. L'exécution de la dernière commande implique simplement Up+ Enter. Cependant, je pensais acheter le clavier Happy Hacking car je passais beaucoup de temps là-dedans vim.

Ce clavier n'a pas de touches fléchées, et la seule façon pour moi d'obtenir ce genre de comportement est d'appuyer sur Ctrl+ Ret de commencer à répéter ma commande précédente.

Existe-t-il un moyen simple d'émuler Up+ Enterdans un terminal UNIX sans les touches de direction?

quant
la source
1
Vous devez remplacer la balise de terminal par le shell que vous utilisez.
Cristian Ciupitu
2
@ illuminÉ pas de souris ...
quant
Le clavier Happy Hacking n’a-t-il pas été abandonné en 2006?
Peter Mortensen
@PeterMortensen non, il est toujours disponible. Vous faites peut-être référence à la première version, mais les modèles les plus récents restent disponibles.
quant

Réponses:

164

Avec cshou toute coquille mise en œuvre csh-comme la substitution de l' histoire ( tcsh, bash, zsh):

!!

Puis Enter.


Ou alternativement :

!-1

Puis Enter.


Ou Ctrl+ P,Enter


Espace magique

En outre, notez que !!et !-1ne se développeront pas automatiquement pour vous, jusqu'à ce que vous les exécutiez (quand il pourrait être trop tard).

Si vous utilisez bash, vous pouvez le mettre bind Space:magic-spacedans ~/.bashrc, puis appuyer sur Spaceaprès la commande pour les développer automatiquement en ligne, ce qui vous permettra de les inspecter avant leur exécution. Ceci est particulièrement utile pour le développement de l'historique à partir d'une commande exécutée il y a longtemps, par exemple !echo, extraira la dernière commande exécutée en commençant par echo. Avec Magic Space, vous obtenez un aperçu de la commande avant son exécution.

C'est l'équivalent de faire bindkey ' ' magic-spacedans tcshou zsh.

Sparhawk
la source
1
@Arman Glad pour aider. Il y a beaucoup de commandes d'expansion de l'historique; le lien en énumère quelques-uns. J'ai modifié certaines informations sur l'espace magique qui pourraient aider à utiliser certaines de celles-ci.
Sparhawk
3
magic-spacec'est une option douce!
fduff
1
Il existe également une histverifyoption permettant shoptà readline de développer l’historique mais de ne pas exécuter la commande lors du premier appui sur la touche Entrée. Ce qui vous permettra d'évaluer le résultat et de décider si c'est ce que vous voulez exécuter.
Etan Reisner
2
Jamais compris pourquoi !! est beaucoup plus utilisé que CTRL-P. CTRL-P vous permet de voir la commande avant de l'exécuter - et vous pouvez même y apporter des modifications. J'ai toujours l'impression de lancer les dés avec !!.
abonet
1
@abonet Une autre utilisation que je viens de découvrir !!est l'utilisation de son extension sur place . Par exemple sudo !!.
Sparhawk
50

La plupart des shells dotés d'une fonctionnalité d'édition en ligne de commande prennent en charge les liaisons de clé Emacs. (un petit sous-ensemble)

Up     Ctrl+P
Down   Ctrl+N
Left   Ctrl+B
Right  Ctrl+F
Home   Ctrl+A
End    Ctrl+E
Delete Ctrl+D

Vous pouvez également configurer votre shell pour qu'il utilise le mode d'édition de commande vi, en l'ajoutant set -o vià votre fichier de démarrage du shell (par exemple, ~/.bashrc). Ensuite, par exemple, vous pouvez

  • Utilisez EsckEnter pour ré-exécuter la commande précédente (identique à !!). La touche moins -fonctionne également comme une commande "déplacer vers le haut".
  • Utilisez EsckkkkkkkkkkkkEnter ou Esc12kEnter pour ré-exécuter la 12ème commande précédente (identique à !-12).
  • Utilisez Escet une commande de mouvement (c'est-à-dire, krépétée de manière appropriée), puis modifiez la ligne de commande bash que vous y trouvez. Rappelez- vous , vous serez toujours en vimode commande, vous devrez utiliser une vicommande d'édition (par exemple, I, A, C, R, ou un de leurs homologues en minuscules) pour ajouter en fait à la commande de l' histoire.
    Donc, par exemple, EsckisudoSpaceEnterest équivalent à sudo !!.
  • Pour les utilisateurs avancés: vous pouvez même copier ( y ANK) texte à partir d' une ligne et la pâte ( p ut) sur un autre, de sorte que vous pouvez obtenir des résultats comparables à !-2:- !$. (Malheureusement, il ne semble pas prendre en charge les tampons nommés.)
Gilles
la source
Je connaissais la relation entre emacs et le terminal ... mais le vitruc était génial !!!
Dox
J'ai eu pour deleteCtl + u dans Zsh
Timo
1
Ceci est implémenté par la bibliothèque readline. Vous trouverez d'autres raccourcis dans sa documentation.
Spidey
28

Mon préféré est CTRL+ Palors CTRL+O

Cela fonctionne par défaut, aucune configuration supplémentaire n'est requise. ^ P vous laissera passer à la dernière commande et ^ O vous laissera exécuter la ligne courante

Notez que CTRL+ Opeut être utilisé autant de fois que vous le souhaitez

Marguerite
la source
2
^ O ne fait rien sur mon Mac.
Snowcrash
1
@Snowcrash Try^J
Daisy
cela fait simplement écho à une ligne vide, même si j'en ai déjà fait un lsou pwdprécédemment.
Snowcrash
@Snowcrash C'est ^ P alors ^ J ...
Marguerite
Ctrl + P ne fonctionne pas sur HP-UX (je ne sais pas quel shell il utilise). La solution de contournement consiste à appeler `zsh '.
Peter Mortensen
15

Sûr! Puisque vous êtes habitué aux vicombinaisons de touches, pourquoi ne pas configurer votre shell pour y répondre? Car bash, mettez ceci dans votre ~/.inputrc:

set editing-mode vi

L'exécution d'instances de bash ne lira pas le fichier. Déconnectez-vous puis reconnectez-vous.

zshdétectera même ceci pour vous: si aucun de vos scripts de démarrage ne force le mode d’édition dans un sens ou dans l’autre à l’aide de bindkey et si votre $EDITORvariable d’environnement est supposée la contenir vi, alors le viraccourci clavier sera automatiquement activé. Si vous avez besoin de le forcer, mettez ceci dans votre ~/.zshrc:

bindkey -v

Par la suite, utilisez ESCcomme d'habitude pour entrer en ligne de commande et ket jpour monter et descendre.

ALSO : Les liaisons de shell par défaut dans la plupart des shells sont les liaisons emacs, donc en réalité Crtl-Pet Ctrl-Ndevraient déjà fonctionner sans que vous ayez à changer quoi que ce soit.

Celada
la source
9

Avec un shell POSIX mise en œuvre du Portabilité utilisateur l' option (y compris ksh, zsh, bash, yash), vous pouvez également utiliser la fccommande suivante :

fc -e : -1

Voir un exemple:

$ echo "hello"
hello

$ fc -e : -1
echo "hello"
hello

Plus d'infos dans Exécutez une gamme de commandes à partir de la réponse de l’histoire de Jonathan Leffler.

Fedorqui
la source
6

Pour tous les utilisateurs Mac iterm2:

Vous pouvez lier + Rà 0x0C 0x10 0x0d. Cela effacera le terminal et exécutera la dernière commande.

Préférences de clé 2

Brian Wigginton
la source
Est-il possible de répéter la dernière commande sans effacer le terminal?
Luke Davis
Ah, tant pis: pour qui lit ceci, pour répéter sans effacer le terminal, utilisez 0x10 0x0d(c.-à-d. Omettez le 0x0C).
Luke Davis
5

Je trouve que j'ai souvent besoin de refaire des commandes en tant que super utilisateur, donc

sudo !!

refait la commande précédente comme si je m'étais souvenu de taper sudoà la première place.

Jared Chmielecki
la source
2
J'aime beaucoup cela, cela ressemble aussi à une bonne réponse à "autorisation refusée". "Je voulais dire sudo ffs!"
Viktor Mellgren
3

Le kshshell a un alias par défaut rqui répète la commande la plus récente. Il est lié à fc -s:

alias r='fc -s'

Fait intéressant, la bashdocumentation de la commande fcintégrée ( help fcet également dans le manuel lui-même) mentionne même cela, mais ce n'est pas un alias par défaut dans ce shell:

Un alias utile à utiliser avec ceci est r='fc -s', de sorte que la frappe r cc exécute la dernière commande commençant par ccet la frappe rré-exécute la dernière commande.

En bash, cela fonctionnerait également même si vous avez désactivé les extensions d’histoire set +H.

Dans le zshshell, il y a une rstructure qui est documentée pour être la même chose que fc -e -.

Cet fcutilitaire est un utilitaire standard POSIX .

Kusalananda
la source
2

Avec cshou toute coquille mise en œuvre csh-comme la substitution de l' histoire ( tcsh, bash, zsh), vous pouvez également utiliser l' !<beginning of command>appeler la dernière commande en commençant par <beginning of command>.

par exemple si vous avez couru

$ tail file.txt
$ less otherfile.txt
$ !ta

!ta exécuterait tail file.txt

Dan
la source
1

tl; dr !!ajoute simplement la dernière commande à votre commande actuelle. <backtick>!!<backtick> exécute la dernière commande et ajoute le résultat à votre commande actuelle.

Il existe actuellement 2 variantes:

  1. La dernière commande elle-même
  2. Le résultat de la dernière commande

Me laisser te montrer 2 exemples:

Exemple 1

$ mkdir /test
mkdir: /test: Permission denied

$ sudo !!
sudo mkdir /test
Password:

Comme vous le voyez ci-dessus, j'exécute une commande et j'ajoute essentiellement la dernière commande.

Une autre variation

Exemple 2

$ find ~/Documents "test.txt"
/Users/<user>/Documents/test.txt

$ vi `!!`
# Opens test.txt. But if you do
$ vi !!
vi find ~/Documents -name "test.txt"
VIM - Vi IMproved 8.1 (2018 May 18, compiled Oct 29 2018 06:55:58)
Unknown option argument: "-name"
More info with: "vim -h"
Pradyumna Shembekar
la source
+1 pour vi `!!`. Très utile
le_daim
0

Lorsque j'utilise un bon émulateur xterm, par exemple, mastic, ma méthode préférée consiste à sélectionner la commande, y compris le saut de ligne, à la copier dans le Presse-papiers, puis à utiliser le clic droit de la souris pour la coller. Cela répète la commande en un seul clic. Cela fonctionne également très bien pour une séquence de commandes séparées par des points-virgules.

Bernard Perrin
la source
0

vous pouvez utiliser !npour exécuter la nième commande dans le terminal. où 'n' est la ligne no of historycommand.

Ravi Sevta
la source
Quel shell se développe !?jusqu'à la dernière commande? Êtes-vous sûr de ne pas le mélanger !!(ce qui a déjà été couvert dans d'autres réponses)?
Anthony Geoghegan
désolé, en fait, j'expérimentais cette commande à ce moment-là. veuillez vérifier la réponse modifiée. @AnthonyGeoghegan
Ravi Sevta
C'était le raccourci que je cherchais. Merci!
le_daim
0
  • Tapez Historique et notez le numéro devant la commande à exécuter et à utiliser. !number

  • Vous pouvez aussi utiliser ! -1 (1 étant la dernière commande que vous avez exécutée, remplacez-la par le nombre que vous obtenez lorsque vous le faites par le bas, en gardant la dernière exécutée comme 1)

  • ! -2 (avant-dernier et ainsi de suite)
Lovish
la source
0

Il y a plusieurs couches dans lesquelles vous pouvez demander la dernière commande.

Éditeur de ligne

L'éditeur de ligne (où vous tapez vos commandes) est fourni directement par ksh, par la bibliothèque readline sous bash et par le type de bibliothèque zle. D'autres shells, tels que dash, peuvent ne pas avoir de bibliothèque d'édition pour comprendre ces clés (à moins d'être compilés avec l' --with-libeditoption activée).

Ce travail en ksh, bash, zsh:

Ctrl- PMode # Emacs (précédent)
Ctrl- NMode # Emacs (suivant)
ESC- k Mode # vi ESC pour aller en mode commande et k pour monter
ESC- j Mode # vi ESC pour aller en mode commande et j pour descendre

histoire

Le système d'historique fourni par de nombreux shells permet d'étendre certains raccourcis:

!!    # bash and zsh, may be provided by `alias \!\!='fc -e -'` in ksh.
!-1   # bash and zsh only

commandes

Certaines commandes permettent de récupérer des commandes d'historique.

Comme la commande assez verbeuse (à imprimer uniquement):

history 2 | head -n-1

ou la commande plus ancienne et donc généralement plus portable fc(directement ré-exécutée):

fc -e - -1

Ou peut-être le plus simple fc -s -1, mais zsh n'accepte pas cette option pour fc.

Si vous voulez seulement imprimer la commande, utilisez: fc -nl -1 -1.

Pour modifier, mettre FCEDITà un éditeur de texte (ex, ed, emacs, vi, etc.) et utiliser directement fc: fc -1.

Isaac
la source