Rozwijanie nawiasów: uruchamianie kilku poleceń zamiast rozwijania w jednym wierszu?

11

Kiedy używasz rozwijania nawiasów klamrowych w bash, coś takiego

echo {a,b,c}

staje się

echo a b c

Czy istnieje sposób na rozwinięcie go do 3 oddzielnych poleceń, po jednym dla każdego rozszerzenia?

Po to aby:

echo {a,b,c}

stanie się

echo a
echo b
echo c
houbysoft
źródło

Odpowiedzi:

12

Czy to tylko pytanie „bo chcę wiedzieć”, czy może jest na to prawdziwe zastosowanie? Możemy przejść przez gimnastykę, aby to zrobić:

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

Ale wytropiłbym każdego, kto wprowadzał tego rodzaju zaciemniające polecenia do naszych skryptów systemowych.

Zamiast tego wybierz jasność:

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

Możesz nawet pójść na całość, wprowadzić kilka nowych linii i wciąć je trochę, abyś zawsze był w stanie zrozumieć, co próbujesz zrobić.

niepythonic
źródło
4
@peth - Zakładam, że jest to uproszczony przykład. Jeśli jest to tak proste jak lista, masz rację. Jeśli jest to coś bardziej podobnego file-{r,b,g}{m,n,o}{x,y.z}.foo, lepiej użyć krótkiej formy niż wyliczyć wszystkie 27 wartości.
niepythonic
@peth - Myślałem, że to dobre pytanie uzupełniające.
niepythonic
chciałem to wiedzieć od dłuższego czasu, dzięki! :)
Sirex,
1
Przypadek użycia to programy, które nie akceptują więcej niż jednego pliku (na przykład), więc tam, gdzie rozszerzenie nie działa. Dlatego fajnie byłoby móc po prostu uruchomić program wiele razy. Te forprace dla tego, ale to jeszcze bardziej wpisując: P
houbysoft
Użyłem go do czyszczenia wielu gałęzi git:eval git branch -d \{ branch-a, branch-b }\;
Kit
3

W oparciu o wybraną odpowiedź Marka Manna mogłem dalej wyprowadzić ten przykład, który działa świetnie:

$ 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

To, co pokazuje, to kiedy używasz wielu wystąpień rozwinięcia nawiasu w linii, oryginalny przykład Marka wydrukowałby każdą odmianę osobno. Zamiast tego chciałem użyć jego odpowiedzi, aby przenieść / zmienić nazwę wielu plików. Aby upewnić się, że wyjście dopasowane format, który mvnormalnie oczekuje ( mv oldfilename newfilename), uciekłem Drugie wystąpienie interpretacji nawiasów, tak, że nie będzie oceniana, aż po początkowym evalkomenda była wykonywana.

Ponieważ powyższe dane wyjściowe pojawiły się zgodnie z oczekiwaniami, byłem w stanie uruchomić następującą komendę:

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

Wielkie podziękowania dla Marka za jego oryginalną odpowiedź. Proszę głosować w górę na jego odpowiedź, jeśli podoba wam się to, na co pozwoliła mi jego odpowiedź :-)

Jon L.
źródło
0
printf '%s\n'  echo{\ a,\ b,\ c}
tae
źródło
eval echo {\ a \;, \ b \;, \ c \;}
Brian Vandenberg