Expansión de llaves: ¿ejecuta varios comandos en lugar de expandirse en una línea?

11

Cuando usas expansión de llaves en bash, algo así como

echo {a,b,c}

se convierte

echo a b c

¿Hay alguna manera de expandirlo a 3 comandos separados, uno para cada expansión?

Así que eso:

echo {a,b,c}

se convertiría

echo a
echo b
echo c
houbysoft
fuente

Respuestas:

12

¿Es solo una pregunta de "porque quiero saber", o hay un caso de uso real para ello? Podríamos hacer algunos ejercicios de gimnasia para hacerlo:

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

Pero cazaría a cualquiera que pusiera este tipo de comandos ofuscadores en los scripts de nuestro sistema.

¿Por qué no buscar claridad?

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

Incluso podría ir por completo y poner un par de líneas nuevas y sangrar un poco para que siempre pueda entender lo que estaba tratando de hacer.

poco pitón
fuente
44
@peth: supongo que este es un ejemplo simplificado. Si es tan simple como una lista, entonces tienes razón. Si es algo más parecido, file-{r,b,g}{m,n,o}{x,y.z}.fooentonces es mejor usar la forma corta que enumerar los 27 valores.
antipático el
@peth: pensé que era una buena pregunta de seguimiento.
antipático el
He querido saber esto durante mucho tiempo, ¡gracias! :)
Sirex
1
Bueno, el caso de uso fue programas que no aceptan más de un archivo (por ejemplo), por lo que la expansión no funcionaría. Por lo tanto, sería bueno poder ejecutar fácilmente el programa varias veces. Las forobras de este, pero es todavía más a escribir: P
houbysoft
Lo usé para limpiar varias ramas de git:eval git branch -d \{ branch-a, branch-b }\;
Kit
3

Basado en la respuesta seleccionada de Mark Mann , pude derivar aún más este ejemplo, que funciona muy bien:

$ 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

Lo que se muestra es que, cuando está utilizando múltiples ocurrencias de expansión de llaves dentro de una línea, el ejemplo original de Mark habría impreso cada variación individualmente. En cambio, quería usar su respuesta para mover / renombrar múltiples archivos. Para garantizar que la salida coincidiera con el formato que mvnormalmente se espera ( mv oldfilename newfilename), escapé de la segunda aparición de expansión de llaves, para que no se evaluara hasta después de que seeval hubiera ejecutado el comando inicial .

Como el resultado anterior apareció como se esperaba, pude ejecutar el siguiente comando:

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

Muchas gracias a Mark por su respuesta original. Por favor, vote su respuesta si le gusta lo que su respuesta me permitió hacer :-)

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