Bash配置自定义PS1提示符时PS_GIT变量未正常显示问题
问题根因
问题核心是Bash变量展开时机不符合预期:
你定义PS_GIT和PS1时使用了双引号,Bash会在配置文件加载的瞬间就把其中的${PS_BRANCH}展开为当时的取值。此时parse_git_branch还没有被触发执行,PS_BRANCH是空值,所以PS_GIT在配置加载完成后就固定为只有黄色转义符的空内容。
后续PROMPT_COMMAND每次触发parse_git_branch更新PS_BRANCH的值时,已经完成静态展开的PS_GIT和PS1不会自动同步更新,所以你手动执行echo $PS_BRANCH能看到正确取值,但提示符里始终不显示分支信息。
修复方案
任选以下一种方案即可解决问题:
方案1:修改PS1定义,让动态变量每次渲染时才展开
把固定内容提前展开,动态的PS_BRANCH放在单引号包裹的区间内,保证每次渲染提示符时才取最新的PS_BRANCH值:
# 替换原有的export PS1=... 配置行 export PS1='\[\033[0G\]'"${PS_INFO}"' ${YELLOW}${PS_BRANCH}'"${PS_TIME}"'\n'"${RESET}"'\$ '
方案2:把PS1拼接逻辑移入parse_git_branch函数
每次更新完分支信息后直接重新生成PS1,从根源避免提前展开的问题:
function parse_git_branch { PS_BRANCH="" if [ -d .svn ] ; then PS_BRANCH="(svn r$(svn info|awk '/Revision/{print $2}'))" return elif [ -f _FOSSIL_ -o -f .fslckout ]; then PS_BRANCH="(fossil $(fossil status|awk '/tags/{print $2}')) " return fi ref=$(git symbolic-ref HEAD 2> /dev/null) || return PS_BRANCH="(git ${ref#refs/heads/}) " # 每次更新分支后重新拼接PS1 local PS_INFO="${GREEN}${USER}${RESET}@${GREEN}${HOSTNAME}${RESET}:${BLUE}\w" local PS_GIT="${YELLOW}${PS_BRANCH}" local PS_TIME=" ${RED}[\t]${RESET}" export PS1="\[\033[0G\]${PS_INFO} ${PS_GIT}${PS_TIME}\n${RESET}\$ " } PROMPT_COMMAND=parse_git_branch # 原来配置里的PS_INFO、PS_GIT、PS_TIME、PS1定义可以删除
验证方式
修改完配置后执行source 你修改的bash配置文件路径(常见为~/.bashrc),进入git仓库目录即可看到分支信息正常展示在提示符中。
内容的提问来源于stack exchange,提问作者Askoi
相关产品推荐
相关产品推荐

