
Tengo un script llamado cpodin
que copia varios artefactos de compilación en otro directorio. Luego, edito SHA1SUM
en 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 fixsha
que no acepte argumentos y lo edite SHA1SUM
en el directorio nombrado por el último argumento del comando anterior? un alias de
alias fixsha='vim !$/SHA1SUM'
da como resultado intentos de editar !$/SHA1SUM
en 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/SHA1SUM
o su equivalente vim "/foo/bar baz/SHA1SUM"
.
Entonces, además de la expansión histórica explícita, eval
tambié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 /SHA1SUM
para 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.