“Cat {foo}” neden foo üretmiyor, ama “cat {foo, bar}” çıkmıyor?


12

Alt klasörlerde metin dosyalarını bitiştirmeye çalışıyordum ve denedim:

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var

Ancak bu bir şey döndürmedi. Bu nedenle, var olmayan bir 'alt klasör2' eklemeyi denedim

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var

Ve bu sefer, dosyaları başarıyla birleştirerek çalıştı. Bu neden oluyor?


2
Hangi komut satırına echosahip catolduğunuzu görmek için kullanın . (Veya set -xhata ayıklama için kullanın .)
Peter Cordes

Yanıtlar:


22

Tanım gereği, GNU Bash'teki küme ayracı genişletmesi, bir dizi ifadesi veya bir dizi virgülle ayrılmış değer gerektirir:

Köşeli ayracı genişletilecek desenler, isteğe bağlı bir başlangıç ​​eki biçimini alır, bunu ya bir dizi virgülle ayrılmış dize veya bir çift ayraç arasında bir dizi ifadesi ve ardından isteğe bağlı bir postscript alır.

Sen edebilirsiniz manuel okumak detaylar için.

Birkaç basit örnek:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2

21

{subfolder1}{subfolder1}Alternatif olmadığı için değerlendirir . subfolder1Bunun yerine kullanın .


2
Bunun içinde csh(küme ayracı genişlemesinin geldiği yer) tcshveya farklı olduğunu unutmayın fish.
Stéphane Chazelas

1

Diş telleri yalnızca koma ile ayrılmış dizeler varsa, örneğin {abc, def} veya aralık, örneğin aralarında belirtilen {a..e} için genişler.

Sizin durumunuzda alt klasöre1 parantez içine almadan yazabilirsiniz.

cat ./{mainfolder1,mainfolder2,mainfolder3}/subfolder1/book.txt > out$var

Ne yazık ki, iki dizeye /path/{a,}/filenamegenişler ve bu istenmeyen olabilir. /path/a/filename/path//filename
Kusalananda

beni düzelttiği için teşekkür @Kusalananda, evet bash "belirsiz yönlendirme" bir uyarı
saing sağlayacaktır

Hayır, ambiguous redirect değeri olmayan sıralanmamış bir değişken tarafından verilen bir dosyaya yönlendirmeyi denerseniz, örneğin echo 'hello' >$idontexist.
Kusalananda

1
... veya yeniden yönlendirmedeki dosya adı birden çok kelimeye genişletilirse. Gibi > *.txtbirden sahip .txtdosyaları veya > $fileeğer $fileboşluk içeriyor. Ama elbette catbirden fazla argüman
vermede
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.