为什么在Bash脚本中执行git branch会输出目录文件,如何仅获取分支列表?
问题原因
git branch的输出中包含用于标记当前活跃分支的*符号,你在脚本中调用echo ${branches}时没有给变量包裹双引号,Bash会对未加引号的变量内容先执行分词+通配符展开操作,其中的*会被识别为通配符,匹配当前目录下的所有文件名替换到输出中,最终就出现了分支名和目录文件混排的问题。- 额外说明:
git branch属于Git面向普通用户的「瓷质命令」,输出格式仅为了方便人眼阅读,本身就不推荐在脚本中直接解析使用。
修复方案
简易临时修复
只需要给变量调用的位置加上双引号,阻止Bash的通配符展开和不必要的分词即可:
branches=$(git branch) echo "$branches"
生产级稳定方案
使用Git专门为脚本调用设计的「管道命令」git for-each-ref获取分支列表,输出内容无特殊符号、格式长期稳定,不会触发通配符匹配问题:
# 获取所有本地分支列表 branches=$(git for-each-ref --format='%(refname:short)' refs/heads/) echo "$branches"
如果需要单独获取当前活跃分支,可直接使用专门命令:
# Git 2.22及以上版本支持 current_branch=$(git branch --show-current)
内容的提问来源于stack exchange,提问作者Chuck
相关产品推荐
相关产品推荐

