如果我运行以下命令:
for r in $(git branch -r | grep -Po "(?<=myremote/).*"); do echo git branch --track $r myremote/$r; done
我得到以下输出:
git branch --track foo myremote/foo
git branch --track bar myremote/bar
git branch --track baz myremote/baz
如果我单独运行这些回显命令,我会得到以下输出:
Branch foo set up to track remote branch foo from myremote.
Branch bar set up to track remote branch bar from myremote.
Branch baz set up to track remote branch baz from myremote.
另一方面,如果我运行以下单行(只需删除“回声”):
for r in $(git branch -r | grep -Po "(?<=myremote/).*"); do git branch --track $r myremote/$r; done
分支创建失败,输出如下:
fatal: 'foo' is not a valid branch name.
fatal: 'bar' is not a valid branch name.
fatal: 'baz' is not a valid branch name.
为什么会发生这种情况,正在运行的命令有什么不同吗?从那以后我该如何调试呢?
更新:
似乎有一些不可见的控制字符流过 unix 管道,即使我指定--color=never
了 for grep
。如果我将正则表达式更改为(?<=myremote/)[\w]*
问题就解决了。但是,我仍然不明白错误的控制字符来自哪里。如果我添加echo $r | od -c
到输出以查看来自管道的原始数据,很明显那里有额外的控制字符:
使用原始正则表达式输出:
0000000 f o o 033 [ m \n
0000007
使用新的正则表达式输出:
0000000 f o o \n
0000004
--color=never
自从我添加了选项后,额外的字符是什么?它是从哪里来的?