Variáveis não enumeradas e substituições de comandos como $i ou $(git …) aplicam-se a operador split + glob para o resultado da string. Isso é:
- Crie uma string contendo o valor da variável ou a saída do comando (menos as novas linhas finais no último caso).
- Divida a string em campos separados de acordo com o valor de
IFS. - Interprete cada campo como um padrão curinga e substitua-o pela lista de nomes de arquivos correspondentes; Se um padrão não corresponder a nenhum arquivo, deixe-o intacto.
A saída de git branch | grep -v master (etapa 1) contém * master , que é dividida (etapa 2) em dois campos * e master ; * é substituído (passo 3) pela lista de nomes de arquivos no diretório atual.
Você pode executar set -f para desativar temporariamente a globulação. Outra abordagem é evitar a substituição de comandos e, em vez disso, analisar a entrada com read . Nem a coisa certa, entretanto - você terá nomes de ramificação falsos, porque a saída do git contém mais do que você precisa (o sinal * para indicar a ramificação atual, mas também coisas como remotes/somewhere/foo -> bar para ramificações de rastreamento remoto) . Eu acho que o seguinte é seguro se deselegante:
for i in $(git branch | sed -e 's/^..//' -e 's/ .*//'); do
echo $i
done
Acho que a maneira mais robusta é usar git-for-each-ref .
for i in $(git for-each-ref --format='%(refname:short)' refs/heads refs/remotes); do
echo $i
done