it-swarm.dev

¿Cómo puedo buscar en el historial de bash y volver a ejecutar un comando?

¿Puedo buscar el historial en bash y ejecutar el resultado?

288
Richard Hoskins

Tipo CtrlR en la línea de comandos y comience a escribir el comando anterior. Una vez que aparece un resultado sigue golpeando CtrlR Para ver otros partidos. Cuando aparezca el comando que desea, simplemente presione Enter

Tenga en cuenta que mientras CtrlR es el valor predeterminado, si desea que el comando (reverse-search-history) esté vinculado a CtrlT Podrías configurarlo con lo siguiente:

 bind '"\ C-t": reverse-search-history' 

Hay una gran cantidad de otros comandos enlazables de readline que también están disponibles para usted. Eche un vistazo a la bash página de manual .

Bash tiene muchas facilidades para buscar y acceder al historial de comandos interactivo. El más básico de los cuales es el history builtin. Escribiendo sólo:

 $ historia 

Imprimirá una lista de comandos junto con un índice numérico, como:

 $ historial 
 1 borrar 
 2 ls -al 
 3 vim ~/somefile.txt 
 4 historial 
 $ 

Luego, puede ejecutar cualquiera de estos comandos utilizando su índice numérico introduciendo el índice con un solo !, como Mitch señalado:

 $! 1 

Ejecutará el comando clear. La historia incorporada tiene muchas características en sí, puede ver más en las páginas de manual de bash y history.

También puede especificar compensaciones negativas relativas al usar el designador !, por lo que al usar nuestra lista de historial anterior, si quisiéramos ejecutar vim nuevamente, podríamos hacer:

 $! -2 

Que básicamente le dice a bash que ejecute el comando que ejecutó "hace dos comandos". Para ejecutar el comando anterior en la lista de historial, podemos usar !! (que es solo una abreviatura de !-1).

El designador ! no le limita a especificar numéricamente qué comando ejecutar. hayalci demostró que puede indicar a bash que ejecute un comando basado en el texto con el que comienza (usando !) o texto dentro del comando (usando !?). Nuevamente, usando nuestra lista de historial de ejemplo anterior, si quisiéramos ejecutar clear nuevamente, todo lo que necesitamos hacer es escribir:

 $! cl 

y presione Enter. ¿Y qué hay de vim? Eso es tan simple como:

 $!? algunos 

El punto más importante de la respuesta de hayalci es la llamada al shopt builtin:

 $ shopt -s histverify 

Esto permitirá la verificación del historial para que los comandos que coincidan con los designadores !, !!, y !? no se ejecuten a ciegas, sino que se completen en la línea de comandos para que pueda asegurarse de que no harán nada malo antes de ejecutarlos. Esto es aún más importante cuando está ejecutando comandos como usuario root. Esta opción se puede configurar en su archivo de inicio .bashrc para que se configure cada vez que inicie sesión.

Como ya se ha señalado, toda esta información se puede obtener de la bash página de manual . Para el!, !!, y!? designadores, eche un vistazo a la Sección 9.3 Expansión de Historia .

421
Sean Bright

Como alternativa a crtl+R, puedes buscar el historial escribiendo

!text

Esto buscará en el historial el comando más reciente que comienza con 'texto'.

Pero te sugiero que pongas esto en tu .bashrc para evitar la ejecución de un comando incorrecto.

shopt -s histverify

Esto le indica a bash que, después de cualquiera acciones de historial (como !!:s/prev_text/after_text), coloca la línea resultante en el símbolo del sistema. Luego puede revisar o editar el comando, y presionar Enter después.

36
hayalci

También podrías hacer:

history | grep "stuff"

volvería algo como

num stuff

entonces puedes escribir

!num
30
Mitch

Prefiero usar el historial de búsqueda hacia atrás sobre el de búsqueda inversa. El primero le permite escribir algunos caracteres del comando luego presionar la tecla de búsqueda, en lugar de presionar primero la tecla de búsqueda y luego escribir la cadena de búsqueda.

Por defecto en mi sistema, M-p y M-n se enlazan a funciones similares, pero prefiero enlazar las teclas de flecha:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
14
Keith

Tengo un alias realmente genial, h. En realidad es solo "history | grep", pero filtro las entradas anteriores de "h command" con "grep -E -v"

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

utilizado como

h aliases
2003  less .bash_aliases
12
CurtH

Excelente escrito, Sean! Yo pondría esto en un comentario, pero tengo algunos puntos de reputación tímidos. :-)

Otra técnica relacionada y útil es la capacidad de ejecutar un comando anterior al cambiar una palabra. Digamos que escribió el nombre del directorio, o que quiere cambiar el nombre del archivo:

$ echo mi nombre es bob 
 mi nombre es bob 
 $ ^ bob ^ jordan 
 echo mi nombre es jordan 
 mi nombre es jordan

Observe que el comando se expande, se reemplaza y se emite antes de que se ejecute el comando, por lo que si se ejecuta el comando incorrecto, puede ver qué pensaba Bash que estaba haciendo.

12
Jordan

Como la navegación a través del historial usando Ctrl-r es un problema de IMO, es posible que desee considerar hh :

https://github.com/dvorka/hstr

lo que hace que la navegación sea mucho más sencilla, directa y eficiente, incluso ejecutando el comando:

enter image description here

5
Martin Dvorak

En el indicador de comando de bash, escriba control-R, luego escriba algunos caracteres del comando que desea y la función de línea de lectura de bash buscará en el historial de comandos para ese comando.

Una vez que haya iniciado la búsqueda, puede escribir control-R nuevamente para saltar al siguiente comando coincidente.

3
John1024

Si tiene su Shell configurado para usar las combinaciones de teclas vi (set -o vi o tener set editing-mode vi en $HOME/.inputrc), busque con <Esc>/some-command<Return> y presione n (siguiente) o Shift-n (anterior) para recorrer el historial de la línea de comandos.

3
Fernando Basso

CTRL+R funciona bien, como sugirió @ John1024, pero es algo tedioso si muchos de sus comandos recientes son similares y quiere una forma rápida de escanearlos todos. Una alternativa sería utilizar history :

$ history | grep keyword
2
Mureinik

Me gusta HSTR, pero a veces parece que no puedo instalarlo. Entonces escribí un alias usando fzf que imita su comportamiento (hx, para "historial de ejecución")

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history: bueno, obtén el historial
  • sed: elimina la columna de números de la lista (POSIX)
  • fzf: aquí está la magia, le permite buscar difusamente la lista de manera interactiva, o moverse con C-J y C-K, luego ejecutar un comando con Enter.
  • --height: establece el número de líneas que se muestran.
  • --tac: revertir lista (más lógico para un historial)
  • --tiebreak=index: mantiene el orden del historial cuando fzf actualiza los resultados
0
Biggybi