poner el comando de historial en la línea de comando sin ejecutarlo

57

Uso! N donde (n) es el número de línea para ejecutar una línea en el archivo de historial que quiero ejecutar en el símbolo del sistema que encuentro a través de history | less.

Pero hay un evento de historial de línea de comando que deseo modificar manualmente. ¿Cómo puedo insertar en la línea de comando un contenido de eventos históricos sin que se ejecute realmente para poder modificarlo y luego presionar Intro?

Mejor,

Vass
fuente

Respuestas:

71

Para solicitar que el comando se imprima en lugar de ejecutarse después de la sustitución del historial, agregue el :p modificador , por ejemplo !42:p. El comando resultante también se ingresará en el historial, por lo que puede presionar Uppara editarlo.

Si tiene la histverify opción establecida ( shopt -s histverify), siempre tendrá la oportunidad de editar el resultado de las sustituciones del historial.

La función fcintegrada brinda acceso limitado a la expansión del historial (sin designadores de palabras) y le permite editar un comando anterior en un editor externo.

Puede usar !prefixpara referirse al último comando que comienza con prefix, y !?substringpara referirse al último comando que comienza con substring. Cuando sabes lo que estás buscando, esto puede ahorrarte mucho tiempo history | less.

Otra forma de buscar en el historial anterior es la búsqueda incremental: presione Ctrl+ Ry comience a ingresar una subcadena de lo que está buscando. Presione Ctrl+ Rpara ir a la aparición anterior de la cadena de búsqueda hasta el momento y Ctrl+ Ssi ha ido demasiado lejos. La mayoría de las teclas que no sean Ctrl+ R, Ctrl+ S, Backspacey caracteres ordinarios terminar la búsqueda incremental y tienen su efecto habitual (por ejemplo, teclas de flecha para mover el cursor en la línea que has alcanzado, Enterpara ejecutar el comando).

Gilles 'SO- deja de ser malvado'
fuente
Hay un error tipográfico en su primer ejemplo ...
pbm
99
Deberá hacerlo stty -ixonantes de que Ctrl-s funcione.
Dennis Williamson el
@ Dennis: Wow, ¿los emuladores de terminal modernos no hacen esto por defecto? <test> Tienes razón, ¡incluso gnome-terminal en Ubuntu tiene control de flujo!
Gilles 'SO- deja de ser malvado'
No sé por qué todavía lo hacen. Es imposible atrapar algo mientras se desplaza. Cuando presiona Ctrl-s, tiene un mensaje nuevamente. Y las conexiones seriales lentas son sobre todo cosa del pasado.
Dennis Williamson el
El punto de @ Dennis Ctrl-ses importante, de lo contrario, uno se queda atascado como lo hice yo .
imz - Ivan Zakharyaschev
15

Otro pequeño: Alt+#

comenta la línea actual y la mueve al búfer de historial.

Entonces, cuando está ensamblando una línea de comando y necesita emitir un comando interino para, por ejemplo, encontrar un archivo, simplemente presiona Alt+ #, emite el otro comando, sube en el historial, descomenta y continúa.

Rahul Patil
fuente
2
Además Esc, #funciona
Steven Penny
y realmente puede escribirlo en una Mac (mantenga presionada la tecla shift, presione ESC y # juntos), a diferencia del otro combo de ket (fn + alt + shift + #) ;-)
0xF2
7

Puedes usar el espacio mágico para expandir la historia antes de presionar enter. En su .inputrc, asigne espacio al espacio mágico:

$if Bash
     Space: magic-space
$endif

Ahora, cada vez que escriba un espacio después de una especificación del historial, se expandirá inmediatamente, ¡útil si también desea editarlo!

Cascabel
fuente
7

Eche un vistazo al history-expand-linecomando, vinculado Alt+^por defecto. Expandirá la línea en el lugar que luego puede editar.

Alex Barrett
fuente
4

Usando Ctrl+rpuede buscar el historial:

pbm@tauri ~ $ 
(reverse-i-search)`xran': xrandr -o normal

Cualquier comando que encuentre podría editarse ...


Creo que encontré exactamente lo que necesita: ejecutar shopt -s histverifyy la próxima vez que quiera usar el !ncomando no se ejecutará, sino que solo se colocará en la línea de comando ...

pbm
fuente
Debe ejecutar un comando antes de que se pueda buscar con Ctrl + r, no lo que Vass está pidiendo.
phunehehe
1
No entiendo cómo esto no hace lo que él pide. Agregaría que si desea editar primero el comando antes de ejecutarlo, simplemente puede presionar TAB una vez que haya encontrado el comando correcto.
Steven D
2
Entonces el procedimiento sería, (1) Ctrl + r, (2) escriba hasta que encuentre el comando, (3) TAB, (4) comando de edición, (5) ENTER.
Steven D
1
@phuenhehe: "Pero hay un evento de historial de línea de comando que deseo modificar manualmente"
pbm
1
No va a !n:pfuncionar?
alex
1

A menudo he querido esto. Cuando usaba csh (y tcsh), tenía un idioma:
!:88*:p

Este modismo inserta "palabra 88 hasta la última palabra" del comando anterior en el punto donde está escribiendo en la línea de comando actual, que generalmente es el final. En csh, no es un error que dicha expresión no produzca palabras. Es decir, no es necesario que haya una palabra 88, ni ninguna que la siga. Si no hay una palabra 88, esto no agrega palabras al final del comando que se está escribiendo y luego empuja la línea de comando resultante al historial sin ejecución.

Como probablemente sabes,
*! (como !! y! -1) es el comando anterior;
*: 88 es la palabra 88 (la primera palabra, generalmente el comando, es cero) y csh requeriría que exista dicha palabra, pero ...
*: 88 * son todas las palabras que comienzan en la palabra 88, y luego csh hace no requiere que la palabra exista;
*: p significa imprimir, pero no ejecuta la línea de comando.
Con o sin: p, la línea de comando se agrega al historial de comandos.

"¿Por qué 88?" ¿te preguntas? Porque es la misma clave que * Necesitaré. Si tiene comandos por tanto tiempo, tal vez!: 888 *: p es lo que necesita. Lo siento, esto no funciona con bash AFAIK. Bash simplemente dirá bash: :88*: bad word specifier

Dato curioso: su comando generalmente no necesita ser el primero.
> /tmp/foo echo My command is word 3
es válido en bash y csh.

W Dean Stanton
fuente
Dado que la pregunta está etiquetada para bash, podría ser bueno comenzar diciendo que su solución solo funciona en (t) csh.
zagrimsan
0

Normalmente uso Ctrl+ rpara buscar y luego Ctrl+ epara ir al final de la línea sin ejecutar.

nikc
fuente
ya mencionado
Jeff Schaller
@JeffSchaller No lo estoy viendo. Veo la referencia CTRL + R. No, ¿dónde veo CTRL + E, que es la pieza faltante del rompecabezas en las publicaciones anteriores?
nikc