¿Cómo repito el último comando sin usar las teclas de flecha?

115

Sé que puedo usar Uppara iterar a través de comandos anteriores. Ejecutar el último comando simplemente implica Up+ Enter. Sin embargo, estaba pensando en comprar el teclado Happy Hacking ya que paso mucho tiempo adentro vim.

Este teclado no tiene teclas de flecha, y la única forma en que sé cómo obtener este tipo de comportamiento es presionando Ctrl+ Ry comenzando a repetir mi comando anterior.

¿Hay una manera fácil de emular Up+ Enteren un terminal UNIX sin las teclas de flecha?

cuant
fuente
1
Debe reemplazar la etiqueta de terminal con el shell que usa.
Cristian Ciupitu
2
@ Illuminé ningún ratón ...
quant
¿No se interrumpió Happy Hacking Keyboard en 2006?
Peter Mortensen
@ PeterMortensen no, todavía está disponible. Puede que se esté refiriendo a la primera versión, pero los modelos más nuevos siguen estando disponibles.
Quant

Respuestas:

164

Con csho cualquier cáscara de la implementación csh-como sustitución de historia ( tcsh, bash, zsh):

!!

Entonces Enter.


O alternativamente :

!-1

Entonces Enter.


O Ctrl+ P,Enter


Espacio mágico

Asimismo, cabe destacar que !!, y !-1no de auto-expansión para ti, hasta que se ejecute (cuando podría ser demasiado tarde).

Si se utiliza bash, puede poner bind Space:magic-spaceen ~/.bashrc, a continuación, pulsando Spacedespués de que el comando de auto-expandirlas en línea, lo que le permite inspeccionarlos antes de la ejecución. Esto es particularmente útil para la expansión del historial de un comando ejecutado hace un tiempo, por ejemplo !echo, extraerá el último comando que comience desde el principio echo. Con el espacio mágico, puede obtener una vista previa del comando antes de que se ejecute.

Eso es el equivalente a hacer bindkey ' ' magic-spaceen tcsho zsh.

Gavilán
fuente
1
@Arman Me alegro de ayudar. Hay muchos comandos de expansión de historia; El enlace enumera algunos de ellos. He editado cierta información sobre el espacio mágico que podría ayudar con el uso de algunos de estos.
Sparhawk
3
magic-space¡Esa es una dulce opción!
fduff
1
También existe la histverifyopción de hacer shoptque readline realice la expansión del historial pero no ejecute el comando la primera vez que presione la tecla Intro. Lo que le permitirá evaluar el resultado y decidir si eso es lo que desea ejecutar.
Etan Reisner
2
Nunca entendí por qué !! se usa mucho más que CTRL-P. CTRL-P le permite ver el comando antes de ejecutarlo, e incluso puede modificarlo. ¡Siempre siento que estoy tirando los dados!
abonet
1
@abonet Otro uso que acabo de encontrar !!es usar su expansión en el lugar . Por ejemplo sudo !!.
Sparhawk
50

La mayoría de los shells que tienen una función de edición de línea de comandos admiten las combinaciones de teclas de Emacs. (un pequeño subconjunto)

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

Alternativamente, puede configurar su shell para usar el modo de edición de comandos vi, agregando set -o via su archivo de inicio de shell (por ejemplo, ~/.bashrc). Entonces, por ejemplo, puedes

  • Use EsckEnter para volver a ejecutar el comando anterior (igual que !!). La tecla menos -también funciona como un comando "subir".
  • Use EsckkkkkkkkkkkkEnter o Esc12kEnter para volver a ejecutar el duodécimo comando anterior (igual que !-12).
  • Use Escy un comando de movimiento (es decir, kadecuadamente repetido), y luego edite la línea de comando bash que encuentre allí. Recuerde, usted todavía estará en viel modo de comandos, por lo que tendrá que utilizar un vicomando de edición (por ejemplo, I, A, C, R, o una de las minúsculas) para agregar realmente a la orden de la historia.
    Entonces, por ejemplo, EsckisudoSpaceEnteres equivalente a sudo !!.
  • Para usuarios avanzados: incluso se puede copiar ( y ANK) de texto de una línea y pegar ( p ut) en otro, por lo que puede lograr resultados comparables a !-2:- !$. (Desafortunadamente, no parece admitir buffers con nombre).
Gilles
fuente
Sabía sobre la relación de emacs con la terminal ... ¡pero el vitruco fue genial!
Dox
Tengo para deleteCtl + u en Zsh
Timo
1
Esto es implementado por la biblioteca readline. Se pueden encontrar atajos adicionales en su documentación.
Spidey
28

Mi favorito es CTRL+ Pluego CTRL+O

Esto funciona de forma predeterminada, no se necesita configuración adicional. ^ P le permitirá cambiar al último comando y ^ O le permitirá ejecutar la línea actual

Tenga en cuenta que CTRL+ Ose puede usar tantas veces como desee

margarita
fuente
2
^ O no hace nada en mi Mac.
Snowcrash
1
@Snowcrash Try^J
daisy
eso solo hace eco de una línea en blanco, incluso si he hecho una lso pwdanteriormente.
Snowcrash
@Snowcrash It's ^ P then ^ J ...
daisy
Ctrl + P no funciona en HP-UX (no sé qué shell está usando). La solución alternativa es invocar 'zsh'.
Peter Mortensen
15

¡Seguro! Como estás acostumbrado a las vicombinaciones de teclas, ¿por qué no configuras tu shell para responder a ellas? Para bash, poner esto en su ~/.inputrc:

set editing-mode vi

Ejecutar instancias de bash no volverá a leer el archivo, así que cierre la sesión y vuelva a iniciarla.

zshincluso detectará esto por usted: si ninguno de sus scripts de inicio fuerza el modo de edición de una forma u otra usando bindkey y si $EDITORse detecta que su variable de entorno contiene vi, entonces habilitará automáticamente las vicombinaciones de teclas. Si necesita forzarlo, ponga esto en su ~/.zshrc:

bindkey -v

A partir de entonces, úselo ESCcomo siempre para ingresar a la línea de comando ky jpara moverse hacia arriba y hacia abajo.

TAMBIÉN : Los enlaces de shell predeterminados en la mayoría de los shells son los enlaces de emacs, por lo que en realidad Crtl-Pya Ctrl-Ndeberían funcionar sin que tenga que cambiar nada.

Celada
fuente
9

Con cualquier shell POSIX aplicación de la portabilidad del usuario opción (incluye ksh, zsh, bash, yash), también se puede utilizar el fccomando:

fc -e : -1

Ver un ejemplo:

$ echo "hello"
hello

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

Más información en Ejecutar una variedad de comandos de la respuesta de la historia de Jonathan Leffler.

fedorqui
fuente
6

Para todos los usuarios de Mac iterm2:

Puedes unir + Ra 0x0C 0x10 0x0d. Esto borrará la terminal y ejecutará el último comando.

Iterm 2 preferencias clave

Brian Wigginton
fuente
¿Hay alguna forma de repetir el último comando sin borrar el terminal?
Luke Davis el
Ah, no importa: para cualquiera que lea esto, para repetir sin borrar el terminal, use 0x10 0x0d(es decir, omita el 0x0C).
Luke Davis el
5

Encuentro que necesito rehacer los comandos como superusuario a menudo, así que

sudo !!

rehace el comando anterior como si hubiera recordado escribir sudoen primer lugar.

Jared Chmielecki
fuente
2
Realmente me gusta esto, también parece una buena respuesta a la "autorización denegada". "Me refería a sudo ffs!"
Viktor Mellgren
3

El kshshell tiene un alias predeterminado rque repite el comando más reciente. Está obligado a fc -s:

alias r='fc -s'

Curiosamente, la bashdocumentación para el fcincorporado ( help fcy también en el manual en sí) incluso menciona esto, pero no es un alias predeterminado en ese shell:

Un alias útil para usar con esto es r='fc -s', de modo que escribir r cc ejecuta el último comando que comienza con ccy escribir rvuelve a ejecutar el último comando.

En bash, esto también funcionaría incluso si ha desactivado las expansiones de historial set +H.

En el zshcaparazón, hay un rarchivo incorporado que está documentado como el mismo fc -e -.

La fcutilidad es una utilidad estándar POSIX .

Kusalananda
fuente
2

Con csho cualquier cáscara de la implementación csh-como sustitución de historia ( tcsh, bash, zsh), también se puede utilizar el !<beginning of command>llamar a la última orden que comienza con <beginning of command>.

por ejemplo si corriste

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

!ta ejecutaría tail file.txt

Dan
fuente
1

tl; dr !!solo agrega el último comando a su comando actual. <backtick>!!<backtick> ejecuta el último comando y agrega la salida a su comando actual.

En realidad hay 2 variantes:

  1. El último comando en sí
  2. El resultado del último comando.

Déjame mostrarte 2 ejemplos:

Ejemplo 1

$ mkdir /test
mkdir: /test: Permission denied

$ sudo !!
sudo mkdir /test
Password:

Como puede ver arriba, estoy ejecutando un comando y esencialmente solo agrego el último comando.

Otra variante

Ejemplo 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
fuente
+1 para vi `!!`. Muy útil
le_daim
0

Cuando estoy usando un buen emulador xterm, por ejemplo, masilla, mi forma favorita de proceder es seleccionar el comando, incluido el avance de línea, copiarlo al portapapeles y luego usar el botón derecho del mouse para pegarlo. Esto repite el comando con un solo clic. Esto también funciona bien para una secuencia de comandos separados por punto y coma.

Bernard Perrin
fuente
0

puedes usar !npara ejecutar el enésimo comando en la terminal. donde 'n' es la línea no de historycomando.

Ravi Sevta
fuente
¿Qué shell se expande !?hasta el último comando? ¿Estás seguro de que no lo estás mezclando !!(que ya se ha cubierto en otras respuestas)?
Anthony Geoghegan
lo siento, en realidad estaba experimentando este comando en ese momento. por favor revise la respuesta editada. @AnthonyGeoghegan
Ravi Sevta
Este fue el atajo que estaba buscando. ¡Gracias!
le_daim
0
  • Escriba Historial y anote el número delante del comando que debe ejecutar y usar !number

  • También puede usar ! -1 (1 es el último comando que ejecuta, reemplácelo con el número de conteo que obtiene cuando lo hace desde abajo manteniendo el último ejecutado como 1)

  • ! -2 (penúltimo y así sucesivamente)
Amoroso
fuente
0

Hay varias capas en las que puede solicitar el último comando.

Editor de línea

El editor de línea (donde escribe sus comandos) lo proporciona directamente ksh, la biblioteca readline en bash y la biblioteca zle en zsh. Otros shells, como el guión, pueden no tener una biblioteca de edición para comprender estas claves (a menos que estén compiladas con la --with-libeditopción habilitada).

Este trabajo en ksh, bash, zsh:

Ctrl- PModo # Emacs (anterior)
Ctrl- NModo # Emacs (siguiente)
ESC- k Modo # vi ESC para ir al modo de comando yk para arriba
ESC- j # modo vi ESC para ir al modo de comando y j para abajo

historia

El sistema de historial proporcionado por muchos shells permite la expansión de algunos atajos:

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

comandos

Hay algunos comandos que pueden recuperar comandos del historial.

Al igual que el comando bastante detallado (solo para imprimir):

history 2 | head -n-1

o el comando anterior y, por lo tanto, generalmente más portátil fc(se vuelve a ejecutar directamente):

fc -e - -1

O tal vez el más simple fc -s -1, pero zsh no acepta esa opción para fc.

Si sólo desea imprimir el comando, utilice: fc -nl -1 -1.

Para editar colocar FCEDITa un editor de texto (por ejemplo, ed, emacs, vi, etc.) y usar fc directamente: fc -1.

Isaac
fuente