¿Cómo recuperar un comando anterior (sin ejecución) para cambiarlo?

14

No recuerdo el truco donde pude obtener el último comando sin ejecutarlo:

digamos que quiero poder acceder al comando! 1255 al presionar la tecla de flecha hacia arriba y modificar el comando. Entonces, ¿cuál es el truco para llamar al comando?

Intenté poner un eco, pero luego tengo un eco antes del comando, no recuerdo cómo hacerlo correctamente.

Arturas M
fuente
44
si entiendo su solicitud correctamente, tal vez solo intente con el sufijo ": p" como en "! 1255: p"
Theophrastus
@Theophrastus sí, exactamente, me había olvidado de esto: parte de p y parecía que no podía encontrar las palabras clave correctas en google para encontrarlo ... Gracias chicos.
Arturas M

Respuestas:

21
!1255:p

Haré esto

!Este historial de recuperación
1255es el número de línea que se
:pimprime pero no se ejecuta

Luego puede usar la flecha hacia arriba para recuperar el comando anterior (no ejecutado) y puede cambiarlo según lo necesite.

A menudo combino esto con hg("History Grep"), mi alias favorito.

$ alias hg  # Maybe use hgr instead if you are a Mercurial CLI user.
alias hg='history | tail -200 | grep -i'

Esto busca texto en una línea de historial reciente, independientemente del caso y se usa de esta manera:

Cuando deseo buscar comandos vi recientes para editar un determinado archivo y luego quiero reutilizar uno de ellos para editar el mismo archivo pero con una extensión de archivo diferente.

$ hg variables
 6153  vi Variables/user-extensions.js 
 6176  vi Variables/user-extensions.js 
 6178  vi Variables/user-extensions.js 
 6190  vi Variables/user-extensions.js 
 6230  hg variables
$ # Notice the difference in case with V and v is ignored
$ !6190:p
vi Variables/user-extensions.js 
$ ["up-arrow"]
$ vi Variables/user-extensions.[now change .js to .html]

También defino hga("History Grep All") para buscar en todo mi historial:

$ alias hga
alias hga='history | grep -i'

pero no lo uso mucho porque mi historial es (intencionalmente) muy grande y obtengo demasiados resultados que luego afectan el desplazamiento a través de las páginas en mi terminal.

Michael Durrant
fuente
2
Tenga en cuenta que hgtambién es la CLI de Mercurial .
usandfriends
1
Buena nota. Añadido a la respuesta.
Michael Durrant
12

Al presionar Ctrl+ R(que es el enlace de la tecla de búsqueda incremental inversa de emacs como se movió @gnp en los comentarios) en el terminal le permite buscar en la historia un comando específico. El comando se mostrará y podrá editar antes de ejecutarlo. Verás algo como esto:

ingrese la descripción de la imagen aquí

Fuente

Hamza Abbad
fuente
1
¡Gracias! Realmente no es la respuesta directa a mi pregunta, pero no lo sabía y lo encuentro realmente útil. ¡Muchas gracias!
Arturas M
1
También cabe destacar que Ctrl + R es la búsqueda incremental inversa de emacs. Muchas combinaciones de teclas de emacs funcionan con muchas herramientas de GNU: Ctrl + A, Ctrl + E, Ctrl + K, Ctrl + Y y otras.
GnP
@gnp Gracias por la información, no lo sabía.
Hamza Abbad
Me tomó mucho tiempo sentirme cómodo con Ctrl-R después de aprender dos cosas clave. 1. ignore la salida mientras escribe. 2. Asegúrese de saber lo suficiente como para escribir lo suficiente de forma única para el comando que desea
Michael Durrant
7

el fccomando hace lo que quieres

fc -l <number> enumerará el historial de comandos alrededor de ese número

fc <number>abrirá esa entrada de línea de comando en vim(o cualquiera que sea su editor predeterminado, supongo), para que pueda editarlo, y :wqestará disponible con la flecha hacia arriba.

Salsa
fuente
7

En bash se Ctl+alt+eexpande la shell, por lo tanto, escribir !1255y luego presionar esta combinación sustituirá la línea actual con el contenido de la entrada de historial 1255

Adonis
fuente
no hizo eso por mí en Ubuntu
Michael Durrant
@ MichaelDurrant, acabo de probar en 14.04 (kubuntu) y funciona para mí. Está documentado en man bashcomo shell-expand-line. Tal vez hay un atajo establecido para gnome-terminal.
Adonis
@adonis Nunca supe este, muchas gracias, de hecho también hace lo que estaba solicitando. Y, de hecho, puedo encontrar más usos de esta función. ¡Increíble! ¡Gracias!
Arturas M
4

Desea utilizar el comando fc mientras especifica la lista en lugar de ejecutar (-l)

fc -ln -1
maullar
fuente