我正在Bash中使用这个函数
function parse_git_branch {
git_status="$(git status 2> /dev/null)"
pattern="^# On branch ([^${IFS}]*)"
if [[ ! ${git_status}} =~ "working directory clean" ]]; then
state="*"
fi
# add an else if or two here if you want to get more specific
if [[ ${git_status} =~ ${pattern} ]]; then
branch=${BASH_REMATCH[1]}
echo "(${branch}${state})"
fi
}
但我决定使用zsh。虽然我可以完美地将其用作shell脚本(甚至没有shebang),但在我的.zshrc中,这个错误是在这一行if [[ ! ${git_status}}
上的解析错误...
我需要做什么才能让它准备好用于zshell?
编辑:我收到的“实际错误”是" parse error near }
,它指的是具有奇怪双重}}
的行,该行在Bash上有效。
编辑:以下是最终代码,仅供娱乐:
parse_git_branch() {
git_status="$(git status 2> /dev/null)"
pattern="^# On branch ([^[:space:]]*)"
if [[ ! ${git_status} =~ "working directory clean" ]]; then
state="*"
fi
if [[ ${git_status} =~ ${pattern} ]]; then
branch=${match[1]}
echo "(${branch}${state})"
fi
}
setopt PROMPT_SUBST
PROMPT='$PR_GREEN%n@$PR_GREEN%m%u$PR_NO_COLOR:$PR_BLUE%2c$PR_NO_COLOR%(!.#.$)'
RPROMPT='$PR_GREEN$(parse_git_branch)$PR_NO_COLOR'
感谢大家的耐心和帮助。
编辑:最佳答案给我们上了一堂课:git status是瓷器(用户界面)。良好的脚本编写应该遵循GIT管道。以下是最终函数:
# The latest version of Chris' function below
PROMPT='$PR_GREEN%n@$PR_GREEN%m%u$PR_NO_COLOR:$PR_BLUE%2c$PR_NO_COLOR%(!.#.$)'
RPROMPT='$PR_GREEN$(parse_git_branch)$PR_NO_COLOR'
请注意,仅提示是zsh特有的。在Bash中,它将是您的提示加上
"\$(parse_git_branch)"
。这可能会更慢(调用GIT次数更多,但这是一个实证问题),但它不会被GIT更改破坏(它们不会更改管道)。这对于良好的脚本向前移动非常重要。
git status
输出的结果永远不会依赖于IFS。您应该使用您期望git status
输出的内容,可能是[^[:space:]]
。但实际上,解析git status
是错误的做法(它是瓷器而不是管道)。 - Chris Johnsen