En Bash, hay algunos operadores útiles para repetir partes del último comando:
!^
se expande al primer argumento del comando anterior, por ejemplo,$ echo one "two three" one two three $ echo !^ echo one one
!$
se expande al último argumento del comando anterior, por ejemplo,$ echo one "two three" one two three $ echo !$ echo "two three" two three
!*
se expande a todos los argumentos del comando anterior, por ejemplo,$ echo one "two three" one two three $ echo !* echo one "two three" one two three
(Según tengo entendido, estos son azúcar sintáctica para !!:^
, !!:$
y !!:*
respectivamente, donde !!
hay un designador de eventos que se expande al comando anterior y ^
, $
y *
son designadores de palabras, consulte el Manual de referencia de Bash o man bash
.)
Estos son a menudo bastante útiles. Pero se vuelve aún más genial con los atajos de teclado:
Cuando presiona Alt+ .o Alt+ _, el último argumento del comando anterior se inserta en el comando actual, de manera similar como si hubiera escrito
!$
en ese punto.También es posible presionar Alt+ Ctrl+ ypara insertar el primer argumento del comando anterior, como si hubiera escrito
!^
en ese punto.
(Consulte la Biblioteca de línea de lectura de GNU o info readline
.)
Tiendo a preferir los atajos de teclado sobre los operadores de historia de Bash, porque puedo ver lo que estoy insertando antes de ejecutar el comando. Sin embargo, no parece haber un atajo que me permita insertar todas las palabras del comando anterior, es decir, uno que !*
funcione. Al menos no pude encontrarlo.
¿Hay tal atajo? Si no, ¿es posible configurar la biblioteca readline para agregar una, y cómo?
zsh
, si escribe echo !*
y luego presiona TAB, tiene el efecto deseado. En general, TAB mientras está en readline expandirá todos los expandibles. Muy útil; probablemente bash tendrá alguna configuración para el mismo efecto? @Seth, creo que esta es la línea de lectura en bash, no el emulador de terminal, aunque no estoy seguro.
man bash
( en algún lugar de la línea 3030)
\e.
y \e_
se asignan a la función readline yank-last-arg
y \e\C-y
se asignan a yank-nth-arg
. Lamentablemente, parece que no hay un comando (único) que agregue múltiples argumentos anteriores a la vez.