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_designatores equivalente a!!: word_designatorpara!!: word_designatorno numérico s (por ejemplo ,!!$es equivalente a!!:$) y -
!: modifieres equivalente a!!: modifier(por ejemplo,!:hes 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. -
hes 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 -
:htoma 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) -
:helimina el componente de ruta de acceso, dejando la cabeza (modificadores).