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.