¿Averigua qué comando ejecuté por última vez que comienza de cierta manera?

8

En el entorno de línea de comandos bash, puede hacer !!para volver a ejecutar su último comando. Y puede presionar la flecha hacia arriba para ver el último comando que ejecutó. Pero, ¿qué sucede si solo desea ver pero no ejecutar el último comando que ejecutó que comenzó de cierta manera?

bernie2436
fuente
1
¿Podría modificar su pregunta? Todavía no tengo claro lo que estás preguntando.

Respuestas:

18

Si busca en el historial mediante Ctrl+ ry escribe algunas letras del comando y no presiona Entersino presiona , el comando aparecerá y no se ejecutará. Otra alternativa es:

history | grep 'mycommand'

Esta buena hoja de historia también podría ayudar.

mkc
fuente
1
Y si no está buscando la primera coincidencia y desea seguir buscando hacia atrás, presione ctrl-r una y otra vez. Y este es solo uno de los muchos comandos poderosos proporcionados por bash history & readline library.
orion
Teniendo en cuenta que tiene la respuesta verificada, extraeré la mía y si desea usar la "^.\{7\}pattern"expresión en su respuesta, ¡puede hacerlo!
si desea editar varios comandos y volver a ejecutarlos, también puede usarlosfc ### ###
Kiwy
9

Puede mostrar la última ejecución del comando, agregando :pa !!:

$ echo 123
123
$ !!:p
echo 123

Si desea mostrar el último comando ejecutado con cierto nombre, use una exclamación:

$ echo 123
123
$ pwd
/home/cuonglm
$ !echo:p
echo 123
Cuonglm
fuente
4

Cada respuesta aquí, por lo que puedo decir, no es portátil. Para una opción portátil, considere la garantía POSIX fc:

    $ man fc

−e editor Use el editor nombrado por editor para editar los comandos. La cadena del editor es un nombre de utilidad, sujeto a búsqueda a través de lavariable PATH ... El valor en lavariable FCEDIT se usará por defecto cuando −e no se especifica. Si FCEDIT es nulo o sin definir , ed se utilizará como editor.

−l (La letra ell.) Enumere los comandos en lugar de invocar un editor en ellos. Los comandos se escribirán en la secuencia indicada por el primer y el último operando, según sea afectado por −r , con cada comando precedido por el número de comando.

−n Suprime los números de comando cuando se enumera con −l .

−r Invierte el orden de los comandos enumerados (con −l ) o editados (sin −l ni −s ) .

−s Vuelva a ejecutar el comando sin invocar un editor.

Operandos

primero , último Seleccione los comandos para listar o editar. El número de comandos anteriores a los que se puede acceder estará determinado por el valor de lavariable HISTSIZE . El valor de primero o último o ambos será uno de los siguientes:

[+ o-] número Un número positivo (o negativo ) que representa un número de comando; los números de comando se pueden mostrar con laopción −l ... Por ejemplo, −1 es el comando inmediatamente anterior ...

Cuando la opción −l se usa para enumerar comandos, el formato de cada comando en la lista será el siguiente:

    "%d\t%s\n", <line number>, <command>

Si se especifican las opciones −l y −n , el formato de cada comando será:

    "\t%s\n", <command>

Si el consiste en más de una línea, las líneas después de la primera se mostrarán como:

    "\t%s\n", <continued-command>

Pero asegúrese de usar -l o -e si SOLO quiere ver / editar sus comandos. De manera predeterminada, fcse abrirá la lista de comandos solicitada en FCEDIT (tenga en cuenta que es distinta de la variable de entorno EDITOR ) y, cuando FCEDIT se cierre , fcejecutará los comandos editados.

De todos modos, específicamente la respuesta a esta pregunta podría ser:

    % fc -l -1

O sin números de línea:

    % fc -ln -1

O los últimos cinco comandos en orden inverso:

    % fc -lrn -1 -5

En tu buscapersonas:

    % fc -lrn -1 -5 |$PAGER

Para su última llamada a fc:

    % fc -l fc
mikeserv
fuente
+1 por esfuerzo. Sin embargo, la pregunta está etiquetada bash
grebneke
Funciona en bash, y todo lo demás. El uso de bashno impide la portabilidad, pero ciertamente desarrollará malos hábitos.
mikeserv
La mejor respuesta aquí y debe ser la aceptada, debido a la portabilidad.
wildeyes
2

presione y Ctrlrluego comience a escribir el comando que desea ver. bash se completará gradualmente. Cuando esté satisfecho, presione Enterpara volver a ejecutarlo o Ctrlgpara cancelar.

Glenn Jackman
fuente
2

Si solo quieres el último comando usa:

 history | cut -c 8- | tail -n 2 | head -n 1 

Si desea poder hacerlo repetidamente, ponga un espacio antes historyo use:

 history | cut -c 8- | grep -Ev '^history' | tail -n 1

Si solo desea ver el último comando que comienza con el patrón xyz:

 history | cut -c 8- | grep -E '^xyz'  | tail -n 1 

Pero esto no funciona si el patrón sería los caracteres iniciales de 'historia' y luego necesitaría algo como:

history | cut -c 8- | grep -Ev 'history \|' | grep -E '^hist'  | tail -n 1 
Anthon
fuente
Hay un error tipográfico en su primer uso de cut.
jon
1
bind '"\ep": history-search-backward'
bind '"\en": history-search-forward'

Y luego puede ingresar algo de texto, y luego Alt-pbuscar los últimos comandos que comienzan igual (y Alt-p, Alt-navanzar y retroceder por ellos).

(Esos son los enlaces de teclas predeterminados para widgets similares en zsh)

Stéphane Chazelas
fuente
0

Agregue estas líneas en un archivo ~/.inputrc:

"\e[A": history-search-backward
"\e[B": history-search-forward

Luego source ~/.inputrcen su shell (o simplemente reinicie el shell).

Ahora puede escribir algunas letras del comando y luego usar las flechas arriba / abajo para recorrer los comandos que comienzan con esas pocas letras.

wim
fuente