Eu adicionei alias para o meu comando git log:
$ alias gl
alias gl='gn -c git log -w -b -p --ignore-blank-lines --full-history'
$ alias gn
alias gn='git-number'
-n sinalizador de
git-number
comando executa o subcomando, comosh -c
faz.
E notei uma coisa estranha. Quando eu corro:
gl -- lib/X.pm
Funciona como:
gn -c "git log -w -b -p --ignore-blank-lines --full-history" -- lib/X.pm
Mas eu espero isso (não aspas no final da string):
gn -c "git log -w -b -p --ignore-blank-lines --full-history -- lib/X.pm"
Aqui está um histórico completo dos comandos:
$ gl -- lib/X.pm
fatal: ambiguous argument 'lib/X.pm': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
$ gn -c "git log -w -b -p --ignore-blank-lines --full-history" -- lib/X.pm
fatal: ambiguous argument 'lib/X.pm': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
$ gn -c "git log -w -b -p --ignore-blank-lines --full-history -- lib/X.pm"
commit 9ce3e165f284d55503eff9b627ef3723854c53bb
...other expected output
Como forçar alias
a juntar opções com alias e novas opções?
Um alias é uma substituição "burra" de uma string por um texto na linha de comando. Um alias não pode usar argumentos ou fazer nada além de fornecer um texto para substituir o nome do alias. No seu exemplo, você deseja pegar o(s) argumento(s) após o nome do alias e inseri -los no comando chamado por
git-number
. Como o alias não entende os argumentos, ele não pode fazer isso.Use uma função shell. A função shell abaixo assume que
git-number -c
funciona exatamente comosh -c
faria com relação ao fornecimento de argumentos para o(s) comando(s) que o utilitário executa:Essa função shell chamaria
git-number -c
com seugit log
comando seguido pela string escolhida arbitrariamentegc
(que, segit-number -c
se comportar comosh -c
, seria colocada$0
no shell que executagit log
) e"$@"
, os argumentos entre aspas da função.O
git log
comando (novamente, desde quegit-number -c
funcione exatamente comosh -c
) seria chamado com os argumentos definidos, seguidos pelos argumentos passados pela função shell.Chamar essa
gn
função com os dois argumentos--
elib/X.pm
acabaria chamandogit log
(viagit-number -c
) com os argumentos extras--
seguidos delib/X.pm
.Como estamos fazendo um esforço para passar os argumentos corretamente, isso também suportaria a passagem de argumentos que contêm espaços e novas linhas, etc. Isso não seria possível se tivéssemos simplesmente injetado
$@
no comando chamado porgit-number -c
da função shell.