次のコマンドを実行すると:
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.
実行中のコマンドに何か違いがありますか? どうすればこれをデバッグできますか?
アップデート:
--color=never
forを指定した場合でも、目に見えない制御文字が unix パイプを流れているようですgrep
。正規表現を(?<=myremote/)[\w]*
問題に変更すると解決します。ただし、誤った制御文字がどこから来ているのかはまだわかりません。echo $r | od -c
パイプを通過する生データを表示するために出力に追加すると、そこに余分な制御文字があることが明らかです。
元の正規表現による出力:
0000000 f o o 033 [ m \n
0000007
新しい正規表現による出力:
0000000 f o o \n
0000004
オプションを追加してから追加された文字はどこから来たの--color=never
ですか?