Como escrevo um alias do bash que substitui!$ pela última palavra do comando anterior?

Como escrevo um alias do bash que substitui!$ pela última palavra do comando anterior?

Eu tenho um script chamado cpodinque copia vários artefatos de construção para outro diretório. Depois, edito SHA1SUMno diretório de destino.

Por exemplo:

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

Como faço para que o último comando seja um alias nomeado fixshaque não aceita argumentos e edita SHA1SUMno diretório nomeado pelo último argumento do comando anterior? Um apelido de

alias fixsha='vim !$/SHA1SUM'

resulta em tentativas de edição !$/SHA1SUMem vez de /foo/bar/baz/SHA1SUM.

Responder1

O Bash não executa a expansão do histórico após a expansão do alias, então você deve fazer isso explicitamente usando history, documentado emRecursos integrados do histórico do Bashe extraído abaixo.

history -ps args

  • -p
    Execute a substituição do histórico noargumentose exibir o resultado na saída padrão, sem armazenar os resultados na lista de histórico.
  • -s
    Os argumentos são adicionados ao final da lista do histórico como uma única entrada.

Um alias de alias fixsha='vim $(history -p !$)/SHA1SUM'funcionará na maioria das vezes, mas não conforme planejado quando !$expandido para um caminho que contém espaços em branco. Adicionar aspas duplas ao redor do argumento path protegerá quaisquer escapes em espaços em branco e resultará em, vim "/foo/bar\ baz/SHA1SUM"em vez do desejado vim /foo/bar\ baz/SHA1SUMou equivalente vim "/foo/bar baz/SHA1SUM".

Portanto, além da expansão explícita do histórico, evaltambém é necessário desembrulhar uma camada de cotação.

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

Observação:Você pode se surpreender ao saber que as aspas duplas na definição de alias acima são desnecessárias. Isso ocorre porque não há espaço em branco entre o valor expandido de !$e /SHA1SUMpara acionar a divisão de palavras do bash. No entanto, gosto que eles estejam lá para enfatizar a intenção de expandir para um único argumento.

informação relacionada