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

297

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

Richard Hoskins
fuente

Respuestas:

428

Escriba Ctrl Ren la línea de comando y comience a escribir el comando anterior. Una vez que aparece un resultado, sigue golpeando Ctrl Rpara ver otros partidos. Cuando aparezca el comando que desea, simplemente presioneEnter

Tenga en cuenta que si bien Ctrl Res el valor predeterminado, si desea que el comando ( reverse-search-history) esté vinculado Ctrl T, puede configurarlo con lo siguiente:

enlace '"\ Ct": historial de búsqueda inversa

Hay una gran cantidad de otros comandos vinculables de línea de lectura que también están disponibles para usted. Echa un vistazo a la bashpágina del manual .

Bash tiene muchas facilidades para buscar y acceder al historial de comandos interactivos. El más básico de los cuales es el historyincorporado. Escribiendo solo:

$ historia

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

$ historia
1 claro
2 ls -al
3 vim ~ / somefile.txt
4 historia
PS

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

$! 1

Ejecutará el clearcomando. La orden interna historia tiene muchas características en sí, se puede ver más en las bashy historyhombre páginas.

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

$! -2

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

El !designador no lo limita a especificar numéricamente qué comando ejecutar. hayalci demostró que puede dar instrucciones bashpara ejecutar un comando basado en el texto con el que comienza (usando !) o en el texto dentro del comando en sí (usando !?). Nuevamente, usando nuestra lista de historial de ejemplo anterior, si quisiéramos ejecutar clearnuevamente, todo lo que tenemos que hacer es escribir:

$! cl

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

$!? algunos

El punto más importante de la respuesta de hayalci es la llamada a la shoptconstrucción:

$ shopt -s histverify

Esto permitirá la verificación de la historia para que los comandos que se corresponden con el !, !!y !?designadores no se ejecutan ciegamente, pero en vez cumplimentado en la línea de comandos para que pueda asegurarse de que van a hacer ningún mal antes de ejecutarlas. Esto es aún más importante cuando ejecuta comandos como usuario root. Esta opción se puede configurar en su .bashrcarchivo de inicio 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 bashpágina del manual . Por el!, !!, y!? designadores, eche un vistazo a la Sección 9.3 Expansión de la historia .

Comunidad
fuente
39
Hace más de 12 años que uso Linux para todos los sistemas. No sabía que existía. Ojalá pudiera +10, ¿cómo lo extrañé?
Aiden Bell
1
En muchos sistemas, presionar la flecha hacia arriba hace lo mismo.
mas
Si alguien consolidara '!', '!!', '!?', 'Historia | grep 'y' ctrl-r 'en una respuesta integral, lo seleccionaría
Richard Hoskins
shoptva en bashrc, no bash_profile (o no estará habilitado para shells que no sean shells de inicio de sesión).
Tobu
2
Además, después de presionar CTRL + R, puede usar CTRL + MAYÚS + R varias veces para volver al comando anterior
Gal Bracha
37

Como alternativa crtl+R, puede buscar en el historial escribiendo

!text

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

Pero le sugiero que ponga esto en su .bashrc para evitar la ejecución de un comando incorrecto.

shopt -s histverify

Esto indica a bash de manera que, después de cualquier acción 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 luego presione Intro.

hayalci
fuente
55
Use!? Text para volver a ejecutar el comando más reciente que contiene (en lugar de comenzar con) "texto".
mark4o
3
Si alguien consolidara '!', '!!', '!?', 'Historia | grep 'y' ctrl-r 'en una respuesta integral, lo seleccionaría.
Richard Hoskins el
32

También puedes hacer:

history | grep "stuff"

devolvería algo como

num stuff

entonces puedes escribir

!num
Mitch
fuente
15

Prefiero usar history-search-backward sobre reverse-search-history. El primero le permite escribir algunos caracteres del comando y luego presionar la tecla de búsqueda, en lugar de presionar la tecla de búsqueda primero y luego escribir la cadena de búsqueda.

Por defecto en mi sistema, Mp y Mn se unen a funciones similares, pero prefiero vincular las teclas de flecha:

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

Tengo un gran alias, h. Realmente es solo "history | grep", pero filtro las entradas anteriores del "comando h" con el "grep -E -v"

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

utilizado como

h aliases
2003  less .bash_aliases
CurtH
fuente
1
Esto también se puede lograr agregando el comando a HISTIGNORE.
tanenbring
12

Excelente redacción, Sean! 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 mientras se cambia una palabra. Supongamos que escribió el nombre del directorio o desea cambiar el nombre del archivo:

$ echo mi nombre es bob
mi nombre es Bob
$ ^ bob ^ jordania
echo mi nombre es jordania
mi nombre es Jordan

Observe que el comando se expande, reemplaza y genera antes de que se ejecute el comando, por lo que si se ejecuta el comando incorrecto, puede ver lo que bash pensó que estaba haciendo.

Jordán
fuente
6

Como la navegación a través del historial con Ctrl-r es IMO engorrosa, es posible que desee considerar hh :

https://github.com/dvorka/hstr

lo que hace que la navegación sea mucho más simple, directa y eficiente, incluida la ejecución del comando:

ingrese la descripción de la imagen aquí

Martin Dvorak
fuente
¿Cómo usarlo? ¿Qué teclas presionar para ver esta imagen?
Nakilon
2
Una vez que instale hh, puede usar el comando hh O vincularlo a cualquier método abreviado de teclado (generalmente Ctrl-r) como se describe en la documentación.
Martin Dvorak
se une a ctrl + rpor defecto ahora
Alleo
4

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

Después de comenzar la búsqueda, puede volver a escribir control-R para saltar al siguiente comando coincidente.

John1024
fuente
3

Si usted tiene su cáscara configurado para utilizar vicombinaciones de teclas ( set -o vio teniendo set editing-mode vien $HOME/.inputrc), entonces se busca con <Esc>/some-command<Return>y golpear n(siguiente) o Shift-n(anterior) para desplazarse por la lista de los comandos.

Fernando Basso
fuente
Este es el más cercano a los usuarios de vim.
Gabor Marton
2

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

$ history | grep keyword
Mureinik
fuente
0

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

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : bueno, consigue la historia
  • sed : eliminar la columna de números de la lista (POSIX)
  • fzf: aquí está la magia, le permite buscar difusamente la lista de forma interactiva, o moverse con C-Jy 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 : mantener el orden del historial cuando fzf actualiza los resultados
Biggybi
fuente