为什么这个 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
不存在于函数中的任何地方,这个定义必须来自其他地方。
正在尝试创建一个自定义 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
不存在于函数中的任何地方,这个定义必须来自其他地方。