ejecutar - script en bash
La(s) forma(s) más rápida(s) para mover el cursor en una línea de comando del terminal? (11)
¿Cuál es la mejor manera de moverse en una línea de comando muy larga en la terminal?
Digamos que utilicé la tecla de flecha o Ctrl - R para obtener esta larga línea de comando:
./cmd --option1 --option2 --option3 --option4 --option5 --option6 --option7 --option8 --option9 --option10 --option11 --option12 --option13 --option14 --option15 --option16 --option17 --option18 --option19 --option20 --option21 --option22 --option23 --option24 --option25 --option26 --option27 --option28 --option29 --option30 --option31 --option32 --option33 --option34 --option35 --option36 --option37 --option38 --option39 --option40 --option41 --option42 --option43 --option44 --option45 --option46 --option47 --option48 --option49 --option50
Ahora necesito mover (comenzando desde el principio o el final de la línea) el cursor hasta --option25
para modificar algo allí.
¿Cuál es la forma más rápida de llegar allí? Lo que suelo hacer es Ctrl - A para llegar al principio y luego repetidamente Alt - F para avanzar, palabra por palabra (o Ctrl - E para ir al final y Alt - B para ir hacia atrás). Pero en una larga fila que toma demasiado tiempo. Debe haber una forma de buscar y saltar directamente a la parte que necesito modificar, por ejemplo, la option25
.
Use el ratón
A veces, la forma más fácil de editar una línea de comando es usando un mouse. Algunas respuestas anteriores dan un comando para abrir su línea actual en su $ EDITOR. Para mí (zhs con grml config) esa combinación es Alt+e
. Si habilita el mouse en su editor, puede usarlo.
Para habilitar el mouse en Vim, agrégalo a tu ~ / .vimrc
set mouse=a
set ttymouse=xterm2
Si luego desea hacer una selección de texto en la terminal (en lugar de pasar el mouse a vim), mantenga presionada la tecla Mayús al hacer clic; esto es específico de la terminal, por supuesto.
Los administradores de sistemas no deben tenerle miedo al mouse.
Búsqueda de historia incremental
en la terminal, ingrese:
gedit ~/.inputrc
luego copiar pegar y guardar
"/e[A": history-search-backward
"/e[B": history-search-forward
"/e[C": forward-char
"/e[D": backward-char
todo lo que necesita hacer para encontrar un comando anterior es ingresar, digamos que las primeras 2 o 3 letras y la flecha hacia arriba lo llevarán rápidamente, digamos que quiero:
for f in *.mid ; do timidity "$f"; done
todo lo que necesito hacer es ingresar
fo
y presiona el comando de flecha hacia arriba pronto aparecerá
Como esto no se ha cerrado aún, aquí hay algunas opciones más.
- Use Ctrl + x seguido de Ctrl + e para abrir la línea actual en el editor especificado por
$FCEDIT
o$EDITOR
oemacs
(intentado en ese orden). - Si ejecutó el comando anteriormente,
option25
Ctrl + r para buscar el historial inverso y escribaoption25
(en este caso). La línea se mostrará. Presione Tab para comenzar a editar en este punto. - Usa la expansión del historial con el modificador
s///
. Por ejemplo!-2:s/--option25/--newoption/
volvería a ejecutar el penúltimo comando, pero reemplaza la opción25. Para modificar el último comando./cmd
, use la sintaxis!string
!./cmd:s/--option25/--newoption/
Se puede usar cualquier delimitador en lugar de / en la sustitución. - Si edita la línea anterior, puede usar la sustitución rápida:
^--option25^--newoption
- Búsqueda de personajes Esto fue mencionado por Pax, y se puede hacer en modo emacs regular con Ctrl + ] para búsqueda hacia adelante, y Ctrl + Alt + ] para búsqueda hacia atrás.
Recomiendo la segunda opción. Ctrl + r es realmente útil y rápido, no se arruina con los editores, y se ven los resultados antes de ejecutar el comando (a diferencia de las expansiones de historial).
Después de ejecutar el comando una vez, ejecuta fc
$EDITOR
con el comando anterior, luego puede usar su editor regular para modificar el comando. Cuando guarde y salga, el archivo se ejecutará.
..pero, como dijo Pax - la línea de comando no es particularmente buena para editar líneas absurdamente largas - ¿por qué no convertir el comando en un guión?
En Cygwin, puede activar dicha función haciendo clic con el botón derecho en la ventana. En la ventana emergente, seleccione Opciones ... -> Mouse -> activar Clics colocar cursor de línea de comando -> Aplicar.
A partir de ahora, simplemente haciendo clic con el botón izquierdo del mouse en alguna posición dentro de la línea de comando colocará el cursor allí.
Mantenga presionada la tecla Opción y haga clic donde desea que se mueva el cursor, y la Terminal acelera el cursor sobre ese punto preciso.
Para ser claros, no desea una "forma rápida de mover el cursor en una línea de comando del terminal ". Lo que realmente desea es una forma rápida de navegar por la línea de comando en su programa shell .
Bash es muy común, por ejemplo. Utiliza la biblioteca Readline para implementar la entrada de línea de comando. Y por así decirlo, es muy conveniente conocer los enlaces Readline ya que se utiliza no solo en bash. Por ejemplo, gdb también usa Readline para procesar la entrada.
En la documentación de Readline puede encontrar todas las vinculaciones relacionadas con la navegación (y más): http://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction
Copiar y pegar brevemente si el enlace de arriba baja:
Bare Essentials
- Cb Retroceder un caracter.
- Cf Avanzar un personaje.
- [DEL] o [Retroceso] Elimina el carácter a la izquierda del cursor.
- Cd Borra el carácter debajo del cursor.
- C-_ o Cx Cu Deshace el último comando de edición. Puede deshacer todo el camino de regreso a una línea vacía.
Movimiento
- Ca Mover al inicio de la línea.
- Ce Mover al final de la línea.
- Mf Avanzar una palabra, donde una palabra se compone de letras y dígitos.
- Mb Mueve hacia atrás una palabra.
- Cl Despeje la pantalla y vuelva a imprimir la línea actual en la parte superior.
Matar y tirar
- Ck Mata el texto de la posición actual del cursor al final de la línea.
- Md Kill desde el cursor hasta el final de la palabra actual, o, si está entre palabras, hasta el final de la siguiente palabra. Los límites de las palabras son los mismos que los utilizados por Mf.
- M- [DEL] Mata del cursor el comienzo de la palabra actual, o, si está entre palabras, al comienzo de la palabra anterior. Los límites de las palabras son los mismos que los utilizados por Mb.
- Cw Mata del cursor al espacio en blanco anterior. Esto es diferente a M- porque los límites de palabras difieren.
- Cy Yank el último texto eliminado en el búfer en el cursor.
- Mi Gire el anillo de matar, y tire de la nueva tapa. Solo puede hacer esto si el comando anterior es Cy o My.
M es la clave Meta. Para Max OS X Terminal puede habilitar "Usar opción como meta clave" en Configuración / Teclado para eso. Para Linux es más complicado.
Actualizar
También tenga en cuenta que Readline puede operar en dos modos:
- modo emacs (que es el predeterminado)
- modo vi
Para cambiar Bash para usar el modo vi:
$ set -o vi
Personalmente, prefiero el modo vi, ya que utilizo vim para la edición de texto.
Prima
En la aplicación de terminal de macOS (y también en iTerm) puede hacer clic con la tecla Opción para mover el cursor (el cursor se moverá a la posición de clic). Esto incluso funciona dentro de vim
.
Si desea avanzar un cierto número de palabras, presione M-<n>
( M-
es para Meta y generalmente es la tecla de escape) y luego presione un número. Esto envía un argumento de repetición a readline, por lo que puede repetir el comando que desee: si desea avanzar, presione M-<n> Mf
y el cursor avanzará <n>
número de palabras.
P.ej
$|echo "two three four five six seven"
$ M-4
(arg: 4) echo "two three four five six seven"
$ M-f
$ echo "two three four| five six seven"
Entonces, para su ejemplo del cursor al comienzo de la línea, usted presionaría, M-26 Mf
y su cursor estaría en --option25|
-o-- desde el final de la línea M-26 Mb
colocaría el cursor en --|option25
Tiendo a preferir el modo de edición vi (ya que esas teclas están incrustadas en mi médula espinal ahora (el cerebro no se usa en absoluto), junto con CTRL-K, CTRL-X de WordStar 3.3 :-). Puede usar la línea de comando set -o vi
para activarla (y set -o emacs
para revertir).
En Vi, sería (ESC-K para obtener la línea primero, por supuesto) " f5;;B
" (sin las comillas dobles).
Por supuesto, debes entender qué hay en la línea para salirte con la tuya. Básicamente, es
f5 to find the first occurrence of "5" (in --option5).
; to find the next one (in --option15).
; to find the next one (in --option25).
B to back up to the start of the word.
Veamos si los aficionados a emacs pueden encontrar una solución mejor, a menos de 5 pulsaciones de tecla (aunque no quiero iniciar una guerra religiosa).
¿Has pensado si tal vez te gustaría poner este comando horrendomente largo en un guión? :-)
En realidad, puedo irme mejor que eso: " 3f5B
" para encontrar la tercera aparición de "5" y luego volver al comienzo de la palabra.
Una opción es usar el Mx shell
en emacs
. Eso proporciona todas las option25
edición y las teclas que tiene emacs
, por lo que Cs
se puede utilizar para buscar la option25
, por ejemplo.
(Pero preferiría estar en el terminal de la terminal real si alguien puede indicarme buenas instalaciones de búsqueda y edición).
Utilice Meta-b / Meta-f para avanzar o retroceder una palabra, respectivamente.
En OSX, Meta se traduce como ESC, que es una mierda.
Pero alternativamente, puede abrir preferencias de terminal -> configuración -> perfil -> teclado y marcar "usar opción como meta clave"