我正在尝试在一些本地 git 分支上运行一个简单的循环,但是每当我运行循环并回显行时,我都会看到它回显我当前工作目录中的所有文件/目录。我没有太多的bash经验,所以我很困惑为什么输出会有所不同。
git branch --merged
向我展示我的期望,只有分支。
for l in $( git branch --merged ); do echo $l; done
这首先显示所有文件/目录,然后显示分支,我不想迭代。
*
将扩展为一个glob。为避免这种情况,您需要引用$l
的扩展。
# Partial fix
for l in $(git branch --merged); do echo "$l"; done
等等,这行不通。您还需要避免$(...)
受到全球膨胀的影响,这更棘手。为此,您可以(暂时(禁用通配
# Works, but clumsy
set -o noglob
for l in $(git branch --merged); do echo "$l"; done
不理想:它将*
和master
打印在单独的行上。它还会更改影响其他命令的全局选项。最好不要管 shell 选项,而是使用while read
循环。
# Best
while IFS= read -r l; do
echo "$l"
done < <(git branch --merged)
这里有两个棘手的问题。一种是使用while read; do ...; done < file
从文件中读取行。语法很奇怪,但它将< file
重定向应用于整个循环。另一位是使用进程替换<(...)
使用通常期望文件名的git branch --merged
的输出。
当前分支标有*
,这被解释为匹配所有文件的模式(期望那些以.
开头的文件(。我马上看到的两个选项是:
-
将内部字段分隔符更改为仅换行符。
IFS=' ' for l in $(git branch --merged); do echo $l; done
-
从结果中删除
*
。for l in $(git branch --merged | tr -d '*'); do echo $l; done