teclado - Bash atajo para obtener el padre del último parámetro utilizado
combinacion de teclas para linux (6)
En mi flujo de trabajo lo hago muy habitualmente:
cat this/very/long/filename.txt
cd !$
bash: cd: this/very/long/filename.txt: Not a directory
Lo que es de esperar :(
Y ahora recupero el último comando, elimino manualmente la parte del archivo y repito el cd
, que ahora funciona. Eso es demasiado escribir !
Sería muy bueno si hubiera un atajo de bash
como:
cd !§
Lo que podría darme el padre del último parámetro utilizado. ¡Lo sé !§
no existe, ¡ojalá lo hubiera! ¿Hay algo que pueda satisfacer esto?
A partir de la respuesta presentada por otras personas, el flujo de trabajo ideal es escribir cd !$:h
después del comando cat this/very/long/filename.txt
. Esta respuesta, cd !$:h
, aún funcionará después de cd !$
, Pero, una vez que haya cometido ese error, puede usar el aún más corto !:h
, que repite el último comando ( cd this/very/long/filename.txt
), pero tomando solo el encabezado de la última palabra.
Estoy usando estas abreviaturas poco conocidas:
-
! word_designator
! word_designator
es equivalente a!!: word_designator
para!!: word_designator
no numérico s (por ejemplo ,!!$
es equivalente a!!:$
) y -
!: modifier
es equivalente a!!: modifier
(por ejemplo,!:h
es equivalente a!!:h
).
En este caso, normalmente lo hago: (tengo enlace de clave emacs)
cd
Alt-dot Alt-b (n veces) Ctrl-K
mejor:
cd
Alt-dot ALT-Retroceso (n veces)
la nota alt-b o ALT-Bs puede presionarse varias veces, hasta que esté satisfecho con la ruta.
En lugar de navegar por el historial, también puede considerar el uso de la variable $_
para referirse al último argumento del comando anterior (consulte _
en la sección Parámetros especiales de bash(1)
).
Para eliminar aún más el componente de nombre de archivo ("todo después de, e incluyendo, la última barra diagonal"), use la expansión de parámetros (Eliminar patrón de sufijo coincidente):
$ cat this/very/long/filename.txt
$ cd ${_%/*}
El último comando será cd this/very/long
desde que /filename.txt
se eliminó. Una diferencia con la expansión del historial es que este comando ( cd ${_%/*}
) se agrega al historial.
Esta versión más corta también funcionaría:
cd !$:h
Detalles:
-
!$
es sinónimo de!!:$
que presenta el último argumento del comando anterior. -
:
separa el modificador del designador de palabra de evento. -
h
es el modificador que elimina el componente de nombre de archivo final.
Et voilà. ¡Los modificadores de la historia vienen al rescate!
$ cd !!:$:h
que se puede abreviar a
$ cd !$:h
Este comando toma el último argumento del comando anterior y elimina el nombre de la ruta final .
En más detalles:
-
!!
se expande al comando anterior -
:$
expande al último argumento del comando anterior -
:h
toma el encabezado ; es decir, elimina el nombre del archivo (que es la parte final del último argumento anterior)
Como un aparte,
!!:$:t
hace exactamente lo contrario.
Para una discusión en profundidad, consulte la documentación de Bash .
cat this/very/long/filename.txt
cd !!^:h
cd this/very/long
-
!!
se refiere al último comando -
^
primer argumento, segunda palabra (designadores de palabras) -
:h
elimina el componente de ruta de acceso, dejando la cabeza (modificadores).