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?
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+P, Enter
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
.
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
!!
). La touche moins - fonctionne également comme une commande "déplacer vers le haut".!-12
).vi
, vous devrez donc utiliser une commande d'édition vi
(par exemple, I, A, C, R, ou l'un de leurs homologues en minuscules) pour ajouter réellement à la commande à partir de l'historique.Sudo !!
.!-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
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.
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.
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.
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.
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
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 taperr cc
exécute la dernière commande commençant parcc
et tapantr
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 .
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:
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"
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
.
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.
Il existe plusieurs couches dans lesquelles vous pouvez demander la dernière commande.
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
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
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
.
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)