web-dev-qa-db-fra.com

Comment répéter la dernière commande sans utiliser les touches fléchées?

Je sais que je peux utiliser Up pour parcourir les commandes précédentes. L'exécution de la dernière commande implique simplement Up + Enter. Cependant, je pensais acheter le Happy Hacking Keyboard car je passe beaucoup de temps dans vim.

Ce clavier n'a pas de touches fléchées, et la seule façon dont je sais comment obtenir ce genre de comportement est en appuyant sur Ctrl + R et commencer à répéter ma commande précédente.

Existe-t-il un moyen simple d'émuler Up + Enter dans un terminal UNIX sans les touches fléchées?

121
quant

Avec csh ou tout autre shell implémentant csh- comme une substitution d'historique (tcsh, bash, zsh):

!!

Alors Enter.


Ou alternativement :

!-1

Alors Enter.


Ou Ctrl+PEnter


Espace magique

Notez également que !! et !-1 ne se développera pas automatiquement pour vous tant que vous ne les exécuterez pas (quand il sera peut-être trop tard).

Si vous utilisez bash, vous pouvez mettre bind Space:magic-space en ~/.bashrc, puis en appuyant sur Space après que la commande les développera automatiquement en ligne, vous permettant de les inspecter avant l'exécution. Ceci est particulièrement utile pour l'expansion de l'historique à partir d'une commande exécutée il y a quelque temps, par ex. !echo tirera la dernière exécution de commande commençant par echo. Avec l'espace magique, vous pouvez prévisualiser la commande avant de l'exécuter.

C'est l'équivalent de faire bindkey ' ' magic-space dans tcsh ou zsh.

171
Sparhawk

La plupart des shells dotés d'une fonction d'édition en ligne de commande prennent en charge les raccourcis clavier Emacs. (un minuscule 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 utiliser le mode d'édition de la commande vi, en ajoutant set -o vi à votre fichier de démarrage Shell (par exemple, ~/.bashrc). Ensuite, par exemple, vous pouvez

  • Utilisation EsckEnter pour réexécuter la commande précédente (identique à !!). La touche moins - fonctionne également comme une commande "déplacer vers le haut".
  • Utilisation EsckkkkkkkkkkkkEnter ou Esc12kEnter pour réexécuter la 12e commande précédente (identique à !-12).
  • Utilisation Esc et une commande de mouvement (c'est-à-dire, k, convenablement répété), puis éditez la ligne de commande bash que vous y trouverez. N'oubliez pas que vous serez toujours en mode de commande vi, vous devrez donc utiliser une commande d'édition vi (par exemple, IACR, ou l'un de leurs homologues en minuscules) pour ajouter réellement à la commande à partir de l'historique.
    Ainsi, par exemple, EsckisudoSpaceEnter est équivalent à Sudo !!.
  • Pour les utilisateurs avancés: vous pouvez même copier (y ank) du texte d'une ligne et le coller (p ut) sur une autre, afin d'obtenir des résultats comparables à !-2:- !$. (Malheureusement, il ne semble pas prendre en charge les tampons nommés.)

Mon préféré est CTRL + P puis CTRL + O

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

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

30
daisy

Sûr! Puisque vous êtes habitué aux vi raccourcis clavier, pourquoi ne pas configurer votre Shell pour y répondre? Pour bash, mettez-le dans votre ~/.inputrc:

set editing-mode vi

L'exécution d'instances de bash ne relira pas le fichier, donc déconnectez-vous et reconnectez-vous.

zsh le détectera même 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 $EDITOR la variable d'environnement est détectée pour contenir vi, puis elle activera automatiquement vi raccourcis clavier. Si vous devez le forcer, mettez-le dans votre ~/.zshrc:

bindkey -v

Par la suite, utilisez ESC comme d'habitude pour entrer en ligne de commande et k et j pour monter et descendre.

AUSSI : Les liaisons Shell par défaut dans la plupart des shells sont les liaisons emacs, donc en fait Crtl-P et Ctrl-N devrait déjà fonctionner sans que vous ayez à changer quoi que ce soit.

16
Celada

Avec tout shell POSIX implémentant l'option Portabilité utilisateur (inclut ksh, zsh, bash, yash), vous pouvez également utiliser la commande fc:

fc -e : -1

Voir un exemple:

$ echo "hello"
hello

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

Plus d'informations dans Exécuter une gamme de commandes à partir de l'historique réponse de Jonathan Leffler.

10
fedorqui

Je trouve que je dois refaire souvent des commandes en tant que super utilisateur, donc

Sudo !!

refait la commande précédente comme si je m'étais souvenu de taper Sudo en premier lieu.

6
Jared Chmielecki

Pour tous les utilisateurs de Mac iterm2:

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

iterm 2 key preferences

6
Brian Wigginton

Avec csh ou tout autre shell implémentant csh- comme la substitution d'historique (tcsh, bash, zsh), vous pouvez également utiliser le !<beginning of command> pour appeler la dernière commande 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

3
Dan

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

alias r='fc -s'

Fait intéressant, la documentation bash pour la commande intégrée fc (help fc, et aussi dans le manuel lui-même) le mentionne même, mais ce n'est pas un alias par défaut dans ce Shell:

Un alias utile à utiliser avec ceci est r='fc -s', afin que taper r cc exécute la dernière commande commençant par cc et tapant r réexécute la dernière commande.

Dans bash, cela fonctionnerait également même si vous avez désactivé les extensions d'historique avec set +H.

Dans le shell zsh, il existe une fonction intégrée r qui est documentée comme étant identique à fc -e -.

L'utilitaire fc est n utilitaire standard POSIX .

3
Kusalananda

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

Il existe en fait 2 variantes:

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

Permettez-moi de vous 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"
1

vous pouvez utiliser !n pour exécuter la nième commande dans le terminal. où 'n' est le numéro de ligne de la commande history.

0
Ravi Sevta

Lorsque j'utilise un bon émulateur xterm, par exemple PuTTY, ma façon préférée de procéder est de sélectionner la commande, y compris le saut de ligne, de la copier dans le presse-papiers, puis d'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.

0
Bernard Perrin

Il existe 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 en bash et par la bibliothèque zle en zsh. D'autres shells, comme le tableau de bord peut ne pas avoir une bibliothèque d'édition pour comprendre ces clés (sauf si compilé avec le --with-libedit option activée).

Ce travail en ksh, bash, zsh:

Ctrl-P # Mode Emacs (précédent)
Ctrl-N # Mode Emacs (suivant)
ESC-k # vi mode ESC pour passer en mode commande et k pour monter
ESC-j # vi mode ESC pour passer en mode commande et j pour descendre

histoire

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

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

commandes

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

Comme la commande assez verbeuse (uniquement pour imprimer):

history 2 | head -n-1

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

fc -e - -1

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

Si vous souhaitez uniquement imprimer la commande, utilisez: fc -nl -1 -1.

Pour éditer, définissez FCEDIT sur un éditeur de texte (ex, ed, emacs, vi, etc.) et utilisez directement fc: fc -1.

0
Isaac
  • Tapez Historique et notez le numéro devant la commande que vous devez exécuter et utiliser !number

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

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