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
¿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.
file-{r,b,g}{m,n,o}{x,y.z}.foo
entonces es mejor usar la forma corta que enumerar los 27 valores.for
obras de este, pero es todavía más a escribir: Peval git branch -d \{ branch-a, branch-b }\;
Basado en la respuesta seleccionada de Mark Mann , pude derivar aún más este ejemplo, que funciona muy bien:
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
mv
normalmente 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:
Muchas gracias a Mark por su respuesta original. Por favor, vote su respuesta si le gusta lo que su respuesta me permitió hacer :-)
fuente
fuente