Busque un comando anterior con el prefijo que acabo de escribir

Podemos usar las flechas hacia arriba y hacia abajo para navegar en el historial de comandos.

En algunos IDE, como Matlab, si ingresamos algo y luego presionamos las teclas de flecha, nos desplazamos solo entre los comandos del historial comenzando con lo que hemos ingresado. Eso es realmente conveniente, pero en un terminal de shell, esto no funciona.

¿Hay alguna forma de obtener una función similar en un terminal de shell? ¿Y algún otro consejo para mejorar la eficiencia en el uso de la terminal?

Comentarios

  • Simplemente puede usar un shell que proporcione tal característica, como fish😉
  • @yoann usted ‘ asume que bash no ‘ t . Lo hace, a través de readline, pero no es accesible de forma predeterminada.
  • @muru Yo ‘ conozco CTRL + R en bash, y egmont ‘ La respuesta proporciona una forma ordenada de hacerlo con Page Up / Page Down. Sin embargo, ¿hay alguna manera de hacerlo con las teclas de flecha?
  • @yoann echa un vistazo a unix.stackexchange.com/a/76591/70524. En lugar de \e[5~ y \e[6~, use \e[A, \e[B.

Respuesta

Lo que busca es Ctrl R .

Escriba Ctrl R y luego escriba parte del comando que desee. Bash mostrará el primer comando coincidente. Siga escribiendo Ctrl R y bash recorrerá los comandos coincidentes anteriores.

Para buscar hacia atrás en el historial, escriba Ctrl S en su lugar. (Si Ctrl S no funciona de esa manera para usted, probablemente significa que debe deshabilitar el control de flujo XON / XOFF: para hacerlo, ejecute stty -ixon.)

Esto está documentado en «Buscando» en man bash.

Comentarios

  • Ctrl-Q para salir del estado congelado, si ya presionó Ctrl-S sin apagar el control de flujo primero y congeló su terminal.

Responder

Colóquelos en su ~/.inputrc:

"\e[5~": history-search-backward "\e[6~": history-search-forward 

Estos hacen Page Up y Page Down se comporta como desee. (Algunas distribuciones ya lo tienen configurado para usted). Personalmente, encuentro esto más conveniente que Ctrl + R o history.

Comentarios

  • Esta es la forma más conveniente de todas las respuestas actuales. Podría u por favor da un poco explicación sobre el mecanismo de trabajo?
  • ~/.inputrc o /etc/inputrc o el archivo al que hace referencia la variable de entorno $INPUTRC es el archivo de configuración de edición de línea de todas las aplicaciones que usan readline, incluido bash (su shell). Tiene ciertas capacidades de edición de línea incorporadas, incluidas estas dos: en la página manual de bash ‘ s, busque una de estas palabras clave para obtener más información. \e[5~ / \e[6~ son las secuencias de escape generadas por las teclas Page Up / Down en la mayoría de los emuladores de terminal; para verlo, ejecute el comando cat y luego presione estas teclas (el byte de escape se representa en la terminal como ^[, en inputrc como \e).
  • El ejemplo en su pregunta original dice que las teclas Arriba / Abajo funcionan de esta manera en Matlab. Sería interesante ver qué pasa si coloca la secuencia de Arriba y Abajo en inputrc y asigna a esta acción; ¿Funcionaría correctamente o tendría efectos secundarios desagradables ya que entra en conflicto con su comportamiento predeterminado? No ‘ no lo sé, ‘ estaría feliz de escuchar tus hallazgos si experimentas con esto.
  • Cuando lo hago echo $INPUTRC, está vacío. Yo ‘ estoy usando Ubuntu 14.04
  • Yo personalmente prefiero anular las flechas hacia arriba y hacia abajo para hacer esto: "\e[A": history-search-backward y "\e[B": history-search-forward

Responder

Además de ^ r / ^ s historial i -search:

alt . inserta la última «palabra» del comando anterior en el cursor. Repítelo para obtener la última palabra de los comandos más antiguos. (Pero tenga en cuenta que un & final cuenta como la última palabra para los comandos en segundo plano).

Esto es muy útil para mkdir foo, cd alt-dot. Incluso más rápido que la flecha hacia arriba, ^ a, alt-d (eliminar palabra de avance), cd.

Para obtener la segunda a la última palabra, use esc - 2 alt+. (es decir use un argumento numérico estilo emacs para alt+..Los recuentos negativos desde el final, los positivos desde el principio). Pero esto suele ser más problemático de lo que vale la pena; en algún momento es más rápido alcanzar el mouse y copiar / pegar, o la flecha hacia arriba y ^ w / ^ y parte de él (ver más abajo).


Si su terminal está bien / correctamente configurada, ctrl-left y ctrl-right irán hacia atrás / adelante por palabras. Si no es así, es de esperar que al menos alt-by alt-f hagan lo mismo.


ctrl- / es un deshacer. Puede usar la repetición automática para eliminar palabras de manera mucho más eficiente si puede deshacer cuando se excede un poco.


Una combinación / combinación de comandos más poderosa proviene del uso del kill-ring, que funciona como en Emacs. ctrl-y para pegar el último ctrl-w / ctrl-u / ctrl-backspace / alt-d. alt-y para recorrer el texto muerto anterior.

Múltiples ctrl-w o lo que sea en una fila hacen en la entrada de kill-ring. Use las flechas izquierda y derecha o algo para dividir la entrada si desea eliminar dos cosas y solo pegar una más tarde.

Combinando todas estas juntas, puede

  • comience a escribir un comando
  • ctrl-r para volver a un comando antiguo y tomar parte de él con control-w o similar.
  • esc-r o alt+r para restaurarlo a como estaba antes de eliminar parte de él.
  • alt- > para ir al final del historial (es decir, la flecha hacia abajo hasta el final), para volver al comando en el que estaba.

Otros consejos de uso interactivo:

Habilite shopt -s globstar, para que pueda hacer **/*.c (recursivo, incluido el dir). A veces es útil para uso interactivo, pero generalmente find -name "*.c" -exec foo {} + es mejor.

Si escribe scripts bash, le resultará útil tener shopt -s extglob habilitado en sus shells interactivos también. A veces encontrará un uso para cosas como *.!(c|h) para hacer coincidir archivos que no» terminan con .co .h.

Busque los alias que desee para ls -l, less y cualquier otra cosa que haga un monton. (cp -i, mv -i y rm -I son agradables. No se acostumbre de depender de ellos para hacer una rm selectiva. GNU rm «s -Yo pregunto una vez por todos los argumentos.)

Me gusta alias m=less (m para «más»). Tengo less configurado con , y . enlazado al archivo anterior / siguiente (lesskey). El valor predeterminado es una secuencia de pulsaciones múltiples que no se puede utilizar con la repetición automática.


Me gusta hacer todo dentro de la pantalla GNU. Me resulta más fácil seguir la pista de las ventanas de pantalla numeradas que una gran cantidad de pestañas en Konsole (o cualquier otro emulador de terminal que haya probado). Si aún no conoce screen, aprenda tmux porque es más nuevo y menos complicado.

Para obtener algo como la funcionalidad de abrir un nuevo shell con el mismo cwd que otro shell, utilizo un gancho personalizado para cd / pushd / popd que me permite hacer cds 8 para cd a lo que sea dir mi shell en la ventana de pantalla 8 está usando. Esto funciona incluso para shells fuera de la sesión de pantalla, siempre que solo haya una sesión de pantalla.

Comentarios

  • El mío no ‘ parece estar » configurado correctamente «. Muchos de los accesos directos que veo aquí no ‘ no funcionan, estoy usando Stock Terminal de Ubuntu 14.04. ¿Cómo puedo configurarlo?
  • @JorgeeFG: Creo que funcionó para mí de inmediato con gnome-terminal en Ubuntu 14.04, antes de cambiar a KDE. La opción relevante está en la configuración de su terminal, esc-prefix vs hig h-bit, y tal vez algunas otras configuraciones. Algunos de ellos no ‘ me funcionan perfectamente a través de ssh. (por ejemplo, ctrl izquierda / derecha munge el código de escape para la tecla de flecha, y aparece 5D literalmente)

Responder

Agregue las siguientes líneas a su ~/.inputrc

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

Esto es similar a la respuesta de egmont, pero en lugar de usar Page Up y Page Down, usa las secuencias de escape para Arrow Up y Arrow Down. Esta forma es mucho más conveniente de usar en una Mac.

Respuesta

Siempre suelo configurar mis máquinas con un HISTSIZE valor para mantener una lista de historial más larga, así como HISTTIMEFORMAT con el valor de marca de tiempo Puedo ver cuándo se ejecutó el comando.

export HISTSIZE=10000 export HISTTIMEFORMAT="%m/%d/%Y %T " 

Responder

El medio que suelo utilizar es combinar el history comando con grep

IE:

history | grep <command im looking for> 

Eso mostrará un historial numerado de los comandos que ha escrito que contienen ese comando, luego puede usar:

!<number listed in history command> 

para rehacer ese comando.

IE:

history | grep history

142 history 143 history | grep lvresize 568 history | grep echo 570 history | grep echo 571 history | grep history 

seguido de: !571

repetirá history | grep history

Comentarios

  • CR = mucho mejor + mucho más seguro
  • Quizás, personalmente, encuentro que un historial canalizado a grep es un medio más rápido para encontrar la mayoría de los comandos. En cuanto a Más seguro, ‘ no estoy seguro de lo que quiere decir, ¿cuáles son los riesgos inherentes al usar el historial en lugar de buscarlo con cR?
  • @ Gravy Sospecho que PSkocik significa que la ! sustitución del historial es menos segura.
  • @Gravy Los riesgos inherentes serían obtener accidentalmente la línea incorrecta. No tengo idea de por qué su terminal se ha congelado, a menos que haya usado Control-S y tenga habilitado el control de flujo xon / xoff (a menudo el valor predeterminado). Si es así, Control-Q lo devolverá.
  • Estoy de acuerdo con @PSkocik, cr es mucho mejor porque ‘ s es más fácil editar la línea del historial, en lugar de volver a ejecutarlo de la misma manera. Ejecutar exactamente el mismo comando nuevamente es un caso trivial de lo que puede hacer para ahorrar tiempo volviendo a escribir variaciones en frases complejas o completando un archivo diferente en una ruta larga. Vea mi respuesta.

Respuesta

Usé 4 consejos diarios (y algunos más) en mi terminal bash:

  • Ejecuta el último comando: !!

  • Ejecutar comando N del historial: !N

  • Imprime el último comando que comienza con prefijo del historial: !prefix:p

  • Ejecuta el último comando que comienza con prefijo del historial: !prefix

Comentarios

  • Creo que usar el comando N del historial es uno de los mejores caminos para dispararse a uno mismo en el pie para la mayoría de los humanos 🙂 Solo digo
  • Responder

    Si está bien que uses zsh en lugar de bash, puedes usar oh-mi-zsh para eso.

    Puede navegar por su historial de comandos con las flechas hacia arriba y hacia abajo. También permite la misma navegación cuando ya ha escrito el texto (como en Mathlab).

    edit: Oh-my-zsh es un gran paquete de software orientado al desarrollador que incluye muchas otras características, p. ej. alias, temas, complementos. Estos extras hacen que la distribución sea más compleja de usar que un atajo de teclado.

    https://github.com/robbyrussell/oh-my-zsh

    Comentarios

    • oh-my-zsh contiene toneladas de cosas. También podrías decir: Esta característica exacta está incluida en esa distribución, cuando todo lo que necesitas es una configuración o aplicación específica.
    • Edité la publicación: advertí que es más grande que una simple aplicación.

    Respuesta

    Agregue el siguiente alias a ~ / .bashrc

    alias h="history | awk """""{$1="";print}""""" |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep" 

    Uso: h fire me dará una lista de comandos que contienen fire . o h ^fire me dará una lista de comandos que comienzan con fire .

    Esto es útil cuando quiero ver una serie de comandos al mismo tiempo.

    Por cierto, """"" es feo pero no pude encontrar otras formas de evitar las comillas simples entre comillas simples.

    Comentarios

    • fyi – h="history | awk '{\$1=\"\"; print}' debería funcionar. Alternativamente, cree una función y llámela.
    • gracias DarkHeart, pero probé su código, encontré que no funcionaba en mi entorno, tal vez haya algo diferente en el mío

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *