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