bash 中的 grom() 关键字抛出意外的 '(' 标记

aug*_*aug 3 bash alias shell-script profile function

我不完全确定为什么我在我的 .bash_profile

syntax error near unexpected token `('
Run Code Online (Sandbox Code Playgroud)

当我将关键字grom()用于我的函数时。我想创建一个 bash 函数,它会自动使用 origin 重新设置我的主分支

# 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"
Run Code Online (Sandbox Code Playgroud)

当我更改函数的名称时,它编译得很好。我找不到grom关键字,所以我不确定问题是什么。如果我将该函数重命名为其他任何名称git-rom,甚至是类似的名称groms,则它可以正常编译。是否有一些特殊的关键字不起作用?这是在 Mac OS X 上。

Ada*_*atz 7

如果您正在使用bash,您可能会更幸运地将其声明为:

function grom() { … }
Run Code Online (Sandbox Code Playgroud)

(注意:在严格的 POSIX shell 中function 不起作用,例如dash!)


@aug建议(通过对此答案的编辑)这是由于别名冲突(或者,不太可能,以某种方式定义的内置函数)。

保留字函数要么改变加载顺序以抢占冲突(在函数定义期间扩展别名),要么通过禁用 bash 的posix 模式(可能允许覆盖内置)来避免该问题。

bash(1)手册页:

别名在读取函数定义时展开,而不是在执行函数时展开,因为函数定义本身就是一个复合命令。因此,函数中定义的别名在执行该函数之前不可用。

如果您有一个冲突的别名,您可以unalias grom在获取之前尝试.bash_profile(除非您仍在定义该冲突的别名,否则没有必要添加到该文件中)以清除您过去的实验。或者,启动一个新终端以重新开始。

  • 我添加了一个编辑我认为可能是问题的答案。 (2认同)