Expanda a chave: execute vários comandos em vez de expandir em uma linha?

11

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
houbysoft
fonte

Respostas:

12

É 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.

antitônico
fonte
4
@ peth - Estou assumindo que este é um exemplo simplificado. Se é realmente tão simples como uma lista, então você está certo. Se for algo mais parecido file-{r,b,g}{m,n,o}{x,y.z}.foo, é melhor usar a forma abreviada do que enumerar todos os 27 valores.
Unpythonic
@ peth - eu pensei que era uma boa pergunta de acompanhamento.
Unpythonic
Eu queria saber disso há muito tempo, obrigado! :)
Sirex
1
Bem, o caso de uso foram programas que não aceitam mais de um arquivo (por exemplo), portanto, onde a expansão não funcionaria. Portanto, seria bom poder executar o programa facilmente várias vezes. As forobras para isso, mas ainda é mais digitação: P
houbysoft
Eu usei-o para limpar vários ramos do git:eval git branch -d \{ branch-a, branch-b }\;
Kit
3

Com base na resposta selecionada de Mark Mann , pude derivar ainda mais este exemplo, que funciona muito bem:

$ eval echo\ category_{17,32,33}.properties\{,.bak\}\;
category_17.properties category_17.properties.bak
category_32.properties category_32.properties.bak
category_33.properties category_33.properties.bak

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 mvnormalmente espera ( mv oldfilename newfilename), escapei da segunda ocorrência de expansão de chaves, para que não fosse avaliada até depois que o evalcomando inicial fosse executado.

Como a saída acima apareceu como o esperado, pude executar o seguinte comando:

$ eval mv\ category_{17,32,33}.properties\{,.bak\}\;
$ ls
category_17.properties.bak  category_32.properties.bak  category_33.properties.bak

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 :-)

Jon L.
fonte
0
printf '%s\n'  echo{\ a,\ b,\ c}
tae
fonte
eval echo {\ a \;, \ b \;, \ c \;} #
Brian Vandenberg