为什么这个 ZSH 函数不设置变量,而是输出 git 命令?

Why is this ZSH function not setting the variables, and outputting a git command instead?

正在尝试创建一个自定义 git 函数来检查 ahead/behind 一个分支到另一个分支的距离。逻辑有效,如果我在终端中逐行 copy/paste 它有效。

但是,将其放入我的 .zshrc 中不会:

function gba() {
  branch="$(git rev-parse --abbrev-ref HEAD)"
  counts_str="$(git rev-list --left-right --count origin/dev...$branch)"
  counts=(${(ps:\t:)${counts_str}})
  behind=$counts[1]
  ahead=$counts[2]

  echo "$branch behind $behind commits, ahead $ahead commits"
}

此外,如果我在脚本中 运行 添加 #!/bin/zsh 并使用 zsh gba.sh 执行,它会起作用。

当我把它放在我的 .zshrc 中(并确保我打开一个新终端 window)时,它会输出所有 git 远程分支。

有什么想法吗?我想把它放在我的 .zshrc 中,所以我没有单独的脚本文件,并且想 运行 它只用 gba 或类似的别名。

调查结果

根据建议,我 运行 了解了 gba.zshrc:

中直接定义时的解释方式
15:33:41 ~$ which gba
gba: aliased to git branch -a
15:33:46 ~$ declare -f gba
gba () {
  branch="$(git rev-parse --abbrev-ref HEAD)"
  counts_str="$(git rev-list --left-right --count origin/dev...$branch)"
  counts=(${(ps:\t:)${counts_str}})
  behind=$counts[1]
  ahead=$counts[2]
  echo "$branch behind $behind commits, ahead $ahead commits"
}
15:34:04 ~$ (set -x; gba)
+-zsh:3> git branch -a
fatal: Not a git repository (or any of the parent directories): .git

解决方案

原来我没有意识到我在 .zshrc 中启用了 git oh-my-zsh 插件:

plugins=(git)

这会加载大量别名(我知道,但我认为我已将其禁用。)因此注释该行使我的 gba 功能完美运行。 oh-my-zsh git 别名很好,但我宁愿边学边学完整的命令,然后在需要时手动添加别名。

问题就在这里:

15:33:41 ~$ which gba
gba: aliased to git branch -a

...还有一个名为 gba 的别名,因此未调用您的函数。 运行 unalias gba 删除它。


顺便说一下,一个重要线索是 set -x 输出:

15:34:04 ~$ (set -x; gba)
+-zsh:3> git branch -a
fatal: Not a git repository (or any of the parent directories): .git

...因为 git branch -a 不存在于函数中的任何地方,这个定义必须来自其他地方。