
Eu tenho um script chamado cpodin
que copia vários artefatos de construção para outro diretório. Depois, edito SHA1SUM
no diretório de destino.
Por exemplo:
cpodin /foo/bar/baz
vim !$/SHA1SUM
Como faço para que o último comando seja um alias nomeado fixsha
que não aceita argumentos e edita SHA1SUM
no diretório nomeado pelo último argumento do comando anterior? Um apelido de
alias fixsha='vim !$/SHA1SUM'
resulta em tentativas de edição !$/SHA1SUM
em 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/SHA1SUM
ou equivalente vim "/foo/bar baz/SHA1SUM"
.
Portanto, além da expansão explícita do histórico, eval
també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 /SHA1SUM
para 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.