Brace expansion: executa vários comandos em vez de expandir em uma linha?

11

Quando você usa a expansão de contraventamento 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?

Para que:

echo {a,b,c}

se tornaria

echo a
echo b
echo c
    
por houbysoft 01.07.2011 / 04:40

3 respostas

12

Isso é apenas uma pergunta "porque eu quero saber" ou existe um caso real de uso para ela? Poderíamos passar por alguma ginástica para fazer isso:

$ eval echo\ {a,b,c}\;
a
b
c

Mas eu procuraria alguém que estivesse colocando esses tipos de comandos ofuscantes em nossos scripts de sistema.

Por que não buscar clareza:

$ for X in {a,b,c}; do echo $X; done

Você pode até mesmo criar um monte de novas linhas e recuar um pouco para que você possa entender o que estava tentando fazer.

    
por 01.07.2011 / 05:30
3

Baseado em Mark A resposta selecionada de Mann , eu pude derivar ainda mais este exemplo, o 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 está sendo mostrado é quando você está usando várias ocorrências de expansão de chave dentro de uma linha, o exemplo original de Mark teria impresso cada variação individualmente. Em vez disso, eu queria usar sua resposta para mover / renomear vários arquivos. Para garantir que a saída corresponda ao formato que mv normalmente espera ( mv oldfilename newfilename ), escapei da segunda ocorrência de expansão de chave, para que ela não fosse avaliada até após a inicial eval comando foi executado.

Como a saída acima apareceu como esperado, consegui 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. Por favor, vote na sua resposta se você gostar do que a resposta dele me permitiu fazer: -)

    
por 07.09.2011 / 18:18
0
printf '%s\n'  echo{\ a,\ b,\ c}
    
por 01.07.2011 / 14:45