Küme ayracı genişletme: bir satırda genişletmek yerine birkaç komut çalıştırılsın mı?


11

Brace genişlemesini bash'ta kullandığınızda,

echo {a,b,c}

olur

echo a b c

Bunu, her genişletme için bir tane olmak üzere 3 ayrı komuta genişletmenin bir yolu var mı?

Böylece:

echo {a,b,c}

olacaktı

echo a
echo b
echo c

Yanıtlar:


12

Bu sadece "bilmek istiyorum" sorusu mu yoksa bunun gerçek bir kullanım durumu var mı? Bunu yapmak için bazı jimnastik yapabiliriz:

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

Ancak bu tür gizemli komutları sistem komut dosyalarımıza koyan herkesi avlardım.

Bunun yerine neden açıklığa kavuşmuyorsunuz?

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

Hatta bütün domuzlara gidip birkaç yeni satır ekleyebilir ve biraz girintili hale getirebilirsiniz, böylece ne yapmaya çalıştığınızı her zaman anlayabilirsiniz.


4
@peth - Bunun basitleştirilmiş bir örnek olduğunu varsayıyorum. Gerçekten bir liste kadar basitse, haklısınız. Eğer daha çok benziyorsa file-{r,b,g}{m,n,o}{x,y.z}.foo, kısa formu kullanmak 27 değerin hepsini saymaktan daha iyidir.
unpythonic

@peth - Bunun iyi bir takip sorusu olduğunu düşündüm.
unpythonic

Bunu uzun zamandır bilmek istedim, teşekkürler! :)
Sirex

1
Kullanım örneği birden fazla dosya kabul etmeyen (örneğin) genişlemelerin çalışmadığı programlardır. Bu nedenle, programı birden çok kez kolayca çalıştırabilmek güzel olurdu. Bunun için forçalışıyor, ama yine de daha fazla
yazıyor

Birden fazla git dalını temizlemek için kullandım:eval git branch -d \{ branch-a, branch-b }\;
Kit

3

Mark Mann'ın seçtiği cevaba dayanarak, harika çalışan bu örneği daha da türetebildim:

$ 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

Gösteren şey, bir satırda birden çok küme ayracı genişlemesi kullandığınızda, Mark'ın orijinal örneği her varyasyonu ayrı ayrı yazdırırdı. Bunun yerine, cevabını birden fazla dosyayı taşımak / yeniden adlandırmak için kullanmak istedim. Çıktının mvnormalde ( mv oldfilename newfilename) beklediği formatla eşleştiğinden emin olmak için , ikinci küme ayracı genişletme oluşumundan kaçtım, böylece ilk komut yürütüldükten sonraya kadar değerlendirilmeyecekti eval.

Yukarıdaki çıktı beklendiği gibi göründüğünden, aşağıdaki komutu çalıştırabildim:

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

Mark'a orijinal cevabı için çok teşekkürler. Cevabını yapmama izin verdiğini beğenirseniz lütfen cevabını yukarı oylayın :-)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.