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


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


271


origen




Respuestas:


Tipo Ctrl  R en la línea de comando y comienza a escribir el comando anterior. Una vez que aparece un resultado sigue golpeando Ctrl  R para ver otras coincidencias Cuando aparezca el comando que desea, simplemente presione Entrar

Tenga en cuenta que si bien Ctrl  R es el predeterminado, si quieres el comando (reverse-search-history) obligarse a Ctrl  T podrías configurar eso con lo siguiente:

bind '"\ C-t": historial de búsqueda inversa'

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

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

$ historial

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

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

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

$! 1

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

También puede especificar compensaciones negativas relativas cuando usa ! designador, entonces, usando nuestra lista de historial de arriba, si queremos ejecutar vim de nuevo, podríamos hacer:

$! -2

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

los ! el designador no lo limita a especificar numéricamente qué comando ejecutar. Hayalci demostró que puedes instruir bash ejecutar un comando basado en el texto con el que comienza (usando !) o texto dentro del comando mismo (usando !?) Nuevamente, usando nuestra lista de historial de ejemplos anterior, si quisiéramos ejecutar clear nuevamente, todo lo que tenemos que hacer es escribir:

$! cl

y prensa Entrar. Y que hay con vim? Eso es tan simple como:

$!? algunos

El punto más importante de HayalciLa respuesta de este es la llamada al shopt incorporado:

$ shopt -s histverify

Esto habilitará la verificación de historial para que los comandos que coincidan con el !, !!y !? los designadores no se ejecutan a ciegas, sino que se completan en la línea de comando para que pueda asegurarse de que no cometerán ningún mal antes de ejecutarlos. Esto es aún más importante cuando está ejecutando comandos como el usuario raíz. Esta opción se puede configurar en su .bashrc archivo de inicio para que se establezca cada vez que inicie sesión.

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


390



+1 He estado usando Linux durante más de 12 años para todos los sistemas. No sabía que existía. Ojalá pudiera +10 ¿Cómo lo extrañé? - Aiden Bell
No lo descubrí hasta que comencé a usar emacs regularmente. Luego, accidentalmente, lo escribí en bash un día (pensando que estaba en emacs). - Sean Bright
En muchos sistemas, presionar la flecha hacia arriba hace lo mismo. - mas
La flecha arriba para mí solo va al comando anterior. Pero sí, todo es vinculable a lo que quieras. - Sean Bright
Además, después de presionar CTRL + R puede usar CTRL + MAYÚSCULAS + R varias veces para volver al comando anterior - Gal Bracha


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

!text

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

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

shopt -s histverify

Esto instruye a bash de tal manera que, después de alguna acciones de historia (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 luego.


34



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


También podrías hacer:

history | grep "stuff"

devolvería algo así como

num stuff

entonces puedes escribir

!num

27





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

De forma predeterminada en mi sistema, M-p y M-n se unen a funciones similares, pero prefiero vincular las teclas de flecha:

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

14





Excelente testimonio, Sean! Pondría esto en un comentario, pero soy unos pocos puntos de reputación tímido. :-)

Otra técnica relacionada y útil es la capacidad de ejecutar un comando previo al cambiar una palabra. Digamos que escribió el nombre del directorio, o 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, reemplaza y da salida antes de ejecutar el comando, de modo que si se ejecuta el comando incorrecto, puede ver lo que bash pensó que estaba haciendo.


12





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

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

usado como

h aliases
2003  less .bash_aliases

12



Esto también se puede lograr agregando el comando a HISTIGNORE. - tanenbring


Como la navegación a través del historial usando Ctrl-r es IMO engorroso, es posible que desee considerar S.S:

https://github.com/dvorka/hstr

lo que hace que la navegación sea mucho más simple, directa y eficiente, incluido ejecutar el comando:

enter image description here


5



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


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

Después de haber iniciado la búsqueda, puede escribir control-R de nuevo para pasar al siguiente comando coincidente.


3





Si tiene su caparazón configurado para usar vi atajos de teclado (set -o vi o teniendo set editing-mode vi en $HOME/.inputrc), luego buscas con <Esc>/some-command<Return> y golpear n (siguiente) o Shift-n (anterior) para recorrer el historial de línea de comando.


3



Este es el más cercano a los usuarios de vim. - Gabor Marton


CTRL+R funciona bien, como se 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 usar history:

$ history | grep keyword

2