Quando você usa a expansão de chaves no bash, algo como
echo {a,b,c}
torna-se
echo a b c
Existe uma maneira de expandi-lo para 3 comandos separados, um para cada expansão?
De modo a:
echo {a,b,c}
se tornaria
echo a
echo b
echo c
É apenas uma pergunta "porque eu quero saber" ou existe um caso de uso real para isso? Poderíamos fazer ginástica para fazê-lo:
$ eval echo\ {a,b,c}\;
a
b
c
Mas eu caçava qualquer um que estivesse colocando esses tipos de comandos ofuscantes em nossos scripts do sistema.
Por que não buscar clareza:
$ for X in {a,b,c}; do echo $X; done
Você pode até ficar louco e colocar algumas novas linhas e recuar um pouco para que você sempre possa entender o que está tentando fazer.
file-{r,b,g}{m,n,o}{x,y.z}.foo
, é melhor usar a forma abreviada do que enumerar todos os 27 valores.for
obras para isso, mas ainda é mais digitação: Peval git branch -d \{ branch-a, branch-b }\;
Com base na resposta selecionada de Mark Mann , pude derivar ainda mais este exemplo, que funciona muito bem:
O que isso está mostrando é que, quando você está usando várias ocorrências de expansão de chaves dentro de uma linha, o exemplo original de Mark teria impresso todas as variações individualmente. Em vez disso, eu queria usar sua resposta para mover / renomear vários arquivos. Para garantir que a saída correspondesse ao formato que
mv
normalmente espera (mv oldfilename newfilename
), escapei da segunda ocorrência de expansão de chaves, para que não fosse avaliada até depois que oeval
comando inicial fosse executado.Como a saída acima apareceu como o esperado, pude executar o seguinte comando:
Muito obrigado a Mark por sua resposta original. Faça um voto positivo na resposta dele se você gostar do que a resposta dele me permitiu fazer :-)
fonte
fonte