2009-07-17 19:23:49 +0000 2009-07-17 19:23:49 +0000
302
302

¿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?

Respuestas (10)

38
38
38
2009-07-17 20:40:32 +0000

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

!text

Esto buscará en el historial el comando más reciente que comience con ‘text’.

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

shopt -s histverify

Esto instruye a bash para que, después de cualquier acción del historial (como !!:s/prev_text/after_text), coloque la línea resultante en el símbolo del sistema. Entonces puede revisar o editar el comando, y presionar Enter después.

33
33
33
2009-07-17 20:21:39 +0000

También podrías hacer:

history | grep "stuff"

te devolvería algo así como

num stuff

entonces puedes escribir

!num
16
16
16
2011-02-02 20:32:12 +0000

Yo prefiero utilizar el historial de búsqueda hacia atrás en lugar del historial de búsqueda hacia atrás. El primero te permite escribir unos cuantos caracteres del comando luego pulsar la tecla de búsqueda, en lugar de pulsar 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 vinculan a funciones similares, pero prefiero vincular las teclas de dirección:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
13
13
13
2014-09-25 16:45:14 +0000

Tengo un alias muy bueno, h. En realidad es sólo “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 "

usado como

h aliases
2003 less .bash_aliases
12
12
12
2009-09-10 14:23:48 +0000

¡Excelente redacción, Sean! Lo pondría en un comentario, pero me faltan unos cuantos puntos de reputación :-)

Otra técnica relacionada y útil es la posibilidad de ejecutar un comando anterior mientras se cambia una palabra. Digamos que escribiste el nombre del directorio, o quieres cambiar el nombre del archivo:

$ echo my name is bob my name is bob $ ^bob^jordan echo my name is jordan my name is jordan

Fíjate que el comando se expande, se reemplaza y sale antes de ejecutar el comando, así que si se ejecuta el comando equivocado puedes ver lo que bash pensó que estaba haciendo.

6
6
6
2014-12-18 16:37:14 +0000

Como la navegación a través del historial utilizando Ctrl-r es OMI engorroso, es posible que desee considerar hh : https://github.com/dvorka/hstr

que hace la navegación mucho más simple, directa y eficiente - incluyendo la ejecución del comando:

4
4
4
2014-09-04 04:55:04 +0000

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

Una vez iniciada la búsqueda, puede escribir control-R de nuevo para saltar al siguiente comando que coincida.

3
3
3
2015-11-22 15:21:56 +0000

Si tienes tu shell configurado para usar los enlaces de las teclas vi (set -o vi o tener set editing-mode vi en $HOME/.inputrc), entonces buscas con <Esc>/some-command<Return> y pulsas n (siguiente) o Shift-n (anterior) para recorrer el historial de la línea de comandos.

2
2
2
2014-09-04 05:11:10 +0000

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

$ history | grep keyword
0
0
0
2019-05-22 13:17:52 +0000

Me gusta HSTR pero a veces no consigo instalarlo. Así que escribí un alias usando fzf que imita su comportamiento (hx, para “ejecutar el historial”)

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : bien, consigue el historial
  • sed : quita la columna de números de la lista (POSIX)
  • fzf : aquí está la magia, te permite buscar difusamente en la lista de forma interactiva, o moverte con C-J y C-K, luego ejecutar un comando con Enter.
  • --height : establece el número de líneas mostradas.
  • --tac : revertir la lista (más lógico para un historial)
  • --tiebreak=index : mantener el orden del historial cuando fzf actualiza los resultados