¿Puedo buscar el historial en bash y ejecutar el resultado?
¿Puedo buscar el historial en bash y ejecutar el resultado?
Respuestas:
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 bash
pá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 history
incorporado. 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 clear
comando. La orden interna historia tiene muchas características en sí, se puede ver más en las bash
y history
hombre 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 vim
nuevamente, 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 bash
para 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 clear
nuevamente, 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 shopt
construcció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 .bashrc
archivo 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 bash
página del manual . Por el!, !!, y!? designadores, eche un vistazo a la Sección 9.3 Expansión de la historia .
shopt
va en bashrc, no bash_profile (o no estará habilitado para shells que no sean shells de inicio de sesión).
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.
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'
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
HISTIGNORE
.
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.
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:
ctrl + r
por defecto ahora
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.
Si usted tiene su cáscara configurado para utilizar vi
combinaciones de teclas ( set -o vi
o teniendo set editing-mode vi
en $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.
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 historiased
: 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-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
: mantener el orden del historial cuando fzf actualiza los resultados