¿Cómo escribo un alias de bash que reemplace !$ con la última palabra del comando anterior?

¿Cómo escribo un alias de bash que reemplace !$ con la última palabra del comando anterior?

Tengo un script llamado cpodinque copia varios artefactos de compilación en otro directorio. Luego, edito SHA1SUMen el directorio de destino.

Por ejemplo:

cpodin /foo/bar/baz
vim !$/SHA1SUM

¿Cómo hago para que el último comando tenga un alias con un nombre fixshaque no acepte argumentos y lo edite SHA1SUMen el directorio nombrado por el último argumento del comando anterior? un alias de

alias fixsha='vim !$/SHA1SUM'

da como resultado intentos de editar !$/SHA1SUMen lugar de /foo/bar/baz/SHA1SUM.

Respuesta1

Bash no realiza la expansión del historial después de la expansión del alias, por lo que debe hacerlo explícitamente usando history, documentado enIncorporaciones del historial de Bashy extraído a continuación.

history -ps args

  • -p
    Realizar la sustitución del historial en elargumentosy mostrar el resultado en la salida estándar, sin almacenar los resultados en la lista del historial.
  • -s
    Los argumentos se agregan al final de la lista del historial como una sola entrada.

Un alias de alias fixsha='vim $(history -p !$)/SHA1SUM'funcionará la mayor parte del tiempo, pero no según lo previsto cuando !$se expande a una ruta que contiene espacios en blanco. Agregar comillas dobles alrededor del argumento de la ruta protegerá cualquier escape en los espacios en blanco y los resultados en vim "/foo/bar\ baz/SHA1SUM"lugar del deseado vim /foo/bar\ baz/SHA1SUMo su equivalente vim "/foo/bar baz/SHA1SUM".

Entonces, además de la expansión histórica explícita, evaltambién es necesario desenvolver una capa de citas.

alias fixsha='eval vim "$(history -p !$)/SHA1SUM"'

Nota:Quizás le sorprenda saber que las comillas dobles en la definición de alias anterior son innecesarias. Esto se debe a que no hay espacios en blanco entre el valor expandido de !$y /SHA1SUMpara activar la división de palabras de bash. Sin embargo, me gusta que estén ahí para enfatizar la intención de que se expanda a un solo argumento.

información relacionada