Mengapa “cat {foo}” tidak menghasilkan foo, tetapi “cat {foo, bar}” menghasilkan?

12

Saya mencoba menggabungkan file teks dalam sub-folder dan mencoba:

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

Namun ini tidak mengembalikan apa pun. Jadi, coba tambahkan 'subfolder2' yang tidak ada

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

Dan kali ini berhasil, menyatukan file dengan sukses. Mengapa ini terjadi?

CDPF
sumber
2
Gunakan echoalih-alih catuntuk melihat baris perintah apa yang Anda dapatkan. (Atau gunakan set -xuntuk debugging.)
Peter Cordes

Jawaban:

22

Menurut definisi, ekspansi brace di GNU Bash membutuhkan ekspresi urutan atau serangkaian nilai yang dipisahkan koma:

Pola yang akan diperluas diperluas dalam bentuk pembukaan opsional, diikuti oleh serangkaian string yang dipisahkan koma atau ekspresi urutan antara sepasang kawat gigi, diikuti oleh postscript opsional.

Anda dapat membaca manual untuk detailnya.

Beberapa contoh sederhana:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2
Arthur Hess
sumber
21

{subfolder1}mengevaluasi {subfolder1}, karena tidak ada alternatif. Gunakan subfolder1sebagai gantinya.

Ignacio Vazquez-Abrams
sumber
2
Perhatikan bahwa ini berbeda dari dalam csh(dari mana ekspansi brace berasal), tcshatau fish.
Stéphane Chazelas
1

Kawat gigi hanya akan mengembang jika mereka memiliki string yang dipisahkan koma, untuk misalnya {abc, def} atau rentang, untuk misalnya {a..e} ditentukan di antara mereka.

Dalam kasus Anda, Anda bisa menulis subfolder1 tanpa melampirkannya di kawat gigi karena tidak perlu

cat ./{mainfolder1,mainfolder2,mainfolder3}/subfolder1/book.txt > out$var
Neo_Returns
sumber
Sayangnya, /path/{a,}/filenamemengembang ke dua string /path/a/filenamedan /path//filename, yang mungkin tidak diinginkan.
Kusalananda
terima kasih @Kusalananda untuk meluruskan saya, ya bash akan memberikan peringatan pesaing "pengalihan ambigu"
Neo_Returns
Tidak, Anda dapatkan ambiguous redirect jika Anda mencoba mengalihkan ke file yang diberikan oleh variabel yang tidak dikutip yang tidak memiliki nilai, misalnya echo 'hello' >$idontexist.
Kusalananda
1
... atau jika nama file dalam pengalihan diperluas ke beberapa kata. Suka > *.txtdengan banyak .txtfile, atau > $filejika $filemengandung spasi. Tapi tentu saja tidak ada yang ambigu dalam memberikan catbeberapa argumen
ilkkachu