Este é um bug de longa data na expansão do alias do bash. Eu poderia reproduzi-lo no Debian lenny amd64 com bash 3.2.29 (1), Debian squeeze i386 com 4.1.5 (1), e Windows XP com Cygwin 1.7.7-1 com bash 4.1.9 (3).
Alguns experimentos mostram que o bug é muito sensível a variações em como o alias é usado. hgfoo
ou hgfoo :
exibe o erro, mas { hgfoo :; }
e (hgfoo)
funcionam bem. Usar uma função em vez de um alias também funciona.
Eu investiguei um pouco, tentando extrair um exemplo menor. A estranheza parece resultar de ter uma nova linha no pseudônimo. Aqui está um exemplo simples em que o bash (3.2.29 ou 4.1.9) se comporta mal. Este alias funciona como esperado (da minha leitura do Single Unix v3) sob pdksh, ksh93, ash e zsh no Debian lenny, a saber oops
prints foo bar
.
$ alias oops='a=$(echo bar)
> echo foo $a'
$ oops
foo foo echo bar
O bug pode estar relacionado a um bug reportado sobre" aliases atrasados estranhos ", mas essa discussão se concentra em continuações de linha (barra invertida-nova linha) que não é usada aqui.
Em qualquer caso, use uma função! Aliases são para one-liners onde você está apenas especificando algumas opções padrão para um comando. Uma função teria o benefício adicional de poder transmitir argumentos para hg
:
hgfoo () {
localChanges=$(hg st -m "$@")
…
}
Inicialmente pensei que isso fosse um bug do Cygwin, mas como o ak2 apontou, este bug também ocorre no Linux.