grom () palavra-chave no bash lança inesperado '(' token

3

Não sei bem por que estou recebendo o erro em .bash_profile

syntax error near unexpected token '('

quando uso a palavra-chave grom() para minha função. Eu queria criar uma função bash que iria apenas automaticamente rebase minha ramificação mestre com origem

# git status
alias gs='git status'

# git stash list
alias gsl='git stash list'  

grom() {
  branch_name="$(git symbolic-ref --short -q HEAD)"
  git fetch && git rebase origin/master && git checkout master && git rebase origin/master && git checkout $branch_name
}

# git stash apply. must append stash@{num}
alias gsa="git stash apply"

Quando eu mudo o nome da função, ela compila bem. Não consegui encontrar grom como palavra-chave, por isso não sei qual é o problema. Se eu renomear a função para qualquer outra coisa como git-rom ou mesmo algo como groms , ela compilará bem. Existem algumas palavras-chave especiais que não funcionam? Isso está no Mac OS X.

    
por aug 25.03.2015 / 22:26

1 resposta

7

Se você estiver usando bash , talvez tenha mais sorte em declarar:

function grom() { … }

(Nota: function não funcionará em shells POSIX estritos como dash !)

@aug sugeriu (via edições desta resposta) que isso é devido a um alias conflitante (ou, menos plausível, um construído que de alguma forma foi definido).

A palavra reservada function altera a ordem de carregamento para antecipar a colisão (aliases se expandem durante a definição da função) ou evita o problema desabilitando o modo posix do bash (que pode permitir a substituição de um builtin).

Na página bash(1) man:

Aliases are expanded when a function definition is read, not when the function is executed, because a function definition is itself a compound command. As a consequence, aliases defined in a function are not available until after that function is executed.

Se você tiver um alias conflitante, poderá tentar unalias grom antes de obter .bash_profile (não é necessário adicionar a esse arquivo, a menos que ainda esteja definindo esse alias conflitante) para limpar suas experiências anteriores. Alternativamente, inicie um novo terminal para um início limpo.

    
por 25.03.2015 / 23:26