Espandi parentesi: esegui diversi comandi invece di espandersi su una riga?


11

Quando usi l'espansione del controvento in bash, qualcosa del genere

echo {a,b,c}

diventa

echo a b c

C'è un modo per espanderlo a 3 comandi separati, uno per ogni espansione, invece?

Così che:

echo {a,b,c}

potrebbe diventare

echo a
echo b
echo c

Risposte:


12

È solo una domanda "perché voglio sapere" o esiste un vero caso d'uso? Potremmo fare un po 'di ginnastica per farlo:

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

Ma darei la caccia a chiunque inserisse questo tipo di comandi offuscati nei nostri script di sistema.

Perché non andare per chiarezza invece:

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

Potresti anche andare a braccetto e inserire un paio di righe e rientrare un po 'in modo da poter sempre capire cosa stavi cercando di fare.


4
@peth - Suppongo che questo sia un esempio semplificato. Se è davvero semplice come un elenco, allora hai ragione. Se è qualcosa di più simile file-{r,b,g}{m,n,o}{x,y.z}.foo, è meglio usare la forma abbreviata piuttosto che elencare tutti i 27 valori.
unpythonic

@peth - Ho pensato che fosse una buona domanda di follow-up.
unpythonic

volevo saperlo da molto tempo, grazie! :)
Sirex,

1
Bene, il caso d'uso era programmi che non accettano più di un file (per esempio), quindi dove l'espansione non funzionerebbe. Pertanto, sarebbe bello poter facilmente eseguire il programma più volte. I forlavori per questo, ma è ancora più digitando: P
HoubySoft

L'ho usato per ripulire più rami git:eval git branch -d \{ branch-a, branch-b }\;
Kit

3

Sulla base della risposta selezionata di Mark Mann , sono stato in grado di derivare ulteriormente questo esempio, che funziona alla grande:

$ 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

Quello che sta mostrando, è quando stai usando più ricorrenze di espansione del controvento all'interno di una linea, l'esempio originale di Mark avrebbe stampato ogni variazione singolarmente. Invece, volevo usare la sua risposta per spostare / rinominare più file. Per garantire che l'output corrispondesse al formato mvnormalmente previsto ( mv oldfilename newfilename), sono riuscito a evitare la seconda occorrenza dell'espansione del controvento, in modo che non fosse valutato fino a dopo l' evalesecuzione del comando iniziale .

Dato che l'output di cui sopra è apparso come previsto, sono stato quindi in grado di eseguire il comando seguente:

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

Mille grazie a Mark per la sua risposta originale. Per favore vota la sua risposta se ti piace ciò che la sua risposta mi ha permesso di fare :-)


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.