¿Cómo puedo moverme por la línea de comando bash de manera eficiente?

19

Así que uso el upen mi shell (Bash en OSX o Ubuntu, principalmente) pero a veces sé que quiero las cosas después de la ubicación actual del cursor. ¿Hay alguna manera de tener la línea en la que estoy completa con la línea de arriba? Golpear upy luego leftes molesto.

Cualquier otro truco también sería genial, excepto por tablo que todos hablamos ahora :)

Aquí hay un ejemplo (por solicitud de ~ quack):

Escribo mkdir /where/the/hell/is/that/thingy luego quiero cd en el mismo directorio. Pero ahora sé sobre meta-b :)

Dan Rosenstark
fuente
1
Un ejemplo explícito sería increíble.
quack quijote
@ ~ quack haciendo ejemplo ahora
Dan Rosenstark
1
aquí hay un (duplicado) pregunta relacionada, con una respuesta bastante bien: superuser.com/questions/124336/...
cregox

Respuestas:

11

Prueba esto:

mkdir /where/the/hell/is/that/thing

luego presione alt+.

dependiendo de su sistema operativo y terminal, es posible que deba escribir a esccontinuación.

También puede presionar alt+ 1+ .para elegir un argumento previo específico.

Esto es mucho mejor que !! o! $ porque realmente puedes ver lo que estás a punto de ejecutar, y de todas formas se necesitan menos pulsaciones de teclas.

editar: estrictamente hablando, metano lo es alt, por lo que también podría funcionar con la tecla "windows" dependiendo de cómo esté configurado su teclado.

usuario23307
fuente
¡interesante! No sabía sobre eso.
quack quijote
2
@justin esto es asombroso. En OSX meta es escape.
Dan Rosenstark
@yar con OS X Terminal también hay una configuración de preferencia en 'Configuración' -> 'Teclado' para 'usar la opción como meta clave'.
ThomasW
Gracias @ThomasW Tengo que volver a estas cosas. Estoy en la línea de comando todos los días, pero uso muy poco de los trucos.
Dan Rosenstark
28

Debería leer man bash en su sistema, particularmente la sección en Readline , ya que este es el mecanismo de entrada interactivo de bash. El manual de Bash en gnu.org tiene una buena sección sobre Edición de línea de comandos que ayudará a llenar algunos de los vacíos.

De manera predeterminada, puede usarlos para moverse en la línea de comandos (solo enumere algunos aquí; consulte el enlace para obtener una lista completa):

  • Ctrl+ se amueve al comienzo de la línea (o Homesegún la configuración del terminal)
  • Ctrl+ se emueve al final de la línea (o End...)
  • Meta+ favanza una "palabra"
  • Meta+ bretrocede una "palabra"

Puede usar estos para "matar" (también conocido como "cortar") texto de una línea:

  • Ctrl+ kmata ("corta") texto desde la posición actual del cursor hasta el final de la línea
  • Ctrl+ yyanks ("pega") el texto eliminado más recientemente en el búfer en el cursor

Por lo tanto, puede combinarlos para seleccionar un fragmento de la línea de comandos que desea repetir, eliminarlo y luego pegarlo al final de su próximo comando.


Ahora, para hacerlo aún más divertido, consideremos la expansión de la historia de bash . Se trata de que !!de que la respuesta de Studer menciones . La expansión de la historia se divide en designadores de eventos , designadores de palabras y modificadores .

Los designadores de eventos se ven así (nuevamente, vea los enlaces para la lista completa):

  • ! - comienza una sustitución de historial
  • !n- el comando n-ésimo en la lista de historial de bash, para algunos enteros n (también funciona para negativos)
  • !!- el comando anterior; equivalente a!-1
  • !string- el comando más reciente que comienza con string

Los designadores de palabras seleccionan ciertas partes de un evento. Use :para separar el evento de la palabra designadora. Las palabras se numeran desde 0 comenzando al principio de la línea, y se insertan en la línea actual separadas por espacios individuales.

  • $- designa el último argumento (por ejemplo, !!:$es el último argumento del último comando; se puede acortar a !$)
  • n- designa la enésima palabra (por ejemplo, !str:2es el segundo argumento del comando más reciente que comienza con str ; !!:0es el comando del último comando)

Entonces, para seguir su ejemplo, si su último comando es mkdir /some/really/long/path, solo ejecutar !!volverá a ejecutar ese comando nuevamente. Pero en su lugar quieres cdentrar en ese camino:

$ cd !$

Ahora supongamos que ejecuta otros comandos y luego desea volver a consultar esa ruta nuevamente. Si ese fue el último comando mkdir que ejecutó, puede usar esto para repetir esa ruta:

$ tar czf ~/foo.tgz !mkdir:$
quijote curandero
fuente
también puede vincular estos (y otros comandos de Readline) a cualquier combinación de teclas que desee; consulte la sección 8.4 del manual, Bindable Readline Commands: gnu.org/software/bash/manual/… y la sección 8.3, Readline Init File: gnu.org/software/bash/manual/bashref.html#Readline-Init-File
quijote quack
gracias que realmente ayuda Aunque se esperaba "leer el manual", es útil mencionar los movimientos básicos de los enlaces. Incluso solo saber ctrl-a podría ser un verdadero ahorro.
Dan Rosenstark
@quack, no hay problema, capté una revisión posterior, de hecho :)
Dan Rosenstark
1
también tenga en cuenta bind -po bind -Pimprimirá sus combinaciones de teclas actuales; esa es la referencia definitiva para lo que usa tu bash .
quack quijote
1
Creo que esta respuesta ha crecido: las cosas en History Expansion son geniales.
Dan Rosenstark
6

Si eres un usuario vi, puedes poner el shell en modo vi escribiendo set -o vi.

Luego puede hacer todo tipo de cosas poderosas en la línea de comando después de escribir Esc + k.

El que más uso es Esc+Kentonces /cualquier texto escrito después de la barra se utilizará para buscar en el historial de la línea de comandos.

por ejemplo, Esc + k /smbclient le dará el último comando smbclient que escribió. Puede desplazarse por todas las búsquedas utilizando las teclas vi estándar ( jy khacia arriba y hacia abajo, pero creo que las flechas hacia arriba y hacia abajo también funcionarán).

Ayuda adicional aquí , también hay algunas cosas incrustadas incorporadas en ese enlace que podrían ser más de lo que estás buscando.

Saludos, Stu.

Stuart Brock
fuente
mientras que el modo vi es inútil para mí, ya que aún no he avanzado a vi, la tinta es increíble. ¡Gracias por eso!
Dan Rosenstark
1
El equivalente sin el modo vi es ctrl-r. Escríbalo y luego parte de un comando anterior. Aparecerá la última aparición de lo que se escribió. Presiona ctrl-r nuevamente para llegar al siguiente. Muy útil.
Nerdfest
3

Puede usar !!cuál representa el último comando:

% prueba
% eco !!
> prueba
Studer
fuente
interesante. No estoy seguro de que quiera manipular esa cadena usando ... ¿qué?
Dan Rosenstark
esto es parte de las instalaciones de historia de bash: gnu.org/software/bash/manual/… .. particularmente la expansión de la historia: gnu.org/software/bash/manual/bashref.html#History-Interaction ... note !!es un sinónimo para !-1: gnu.org/software/bash/manual/bashref.html#Event-Designators
quack quixote
2
Esto es realmente útil para cuando se olvida de usar sudo: es decir, sudo !! - $ more / etc / sudoers / etc / sudoers: ¡Permiso denegado $ sudo! sudo more / etc / sudoers [sudo] contraseña para ..: # / etc / sudoers ... ... ...
user9632
@wookiebreath, gracias por eso, votaré esta respuesta ahora
Dan Rosenstark
0

En el ejemplo que da, use! $ Para representar el último parámetro del comando anterior:

mkdir / algo / algo

cd! $

También puede usar variaciones numeradas para extraer parámetros específicos de comandos anteriores.

Nerdfest
fuente
0

Recientemente encontré esta hoja de referencia de readline muy útil. Muchas cosas que no sabía. Solía ​​usar !$todo el tiempo hasta que descubrí acerca de Alt+ ., que ahora uso todo el tiempo. :)

fredden
fuente