Mengapa gema mencocokkan beberapa file dua kali?


11
$ touch file{1..12}

$ echo *e{1..12}
file1 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12

$ echo *{1..12}
file1 file11 file12 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12

Saya tidak mengerti mengapa ini terjadi. Tolong bisakah seseorang menjelaskan?

Jawaban:


21

Kawat gigi bukan pola wildcard. Periksa dokumentasi ekspansi bash : kawat gigi diperluas sangat awal dalam proses, dan pola wildcard diperluas pada langkah terakhir¹.

Awalnya, perintah terdiri dari dua kata echo, *{1..12}. Setelah ekspansi brace, perintah berisi 13 kata: echo, *1, *2, ..., *12. Kemudian pola wildcard diperluas. *1memperluas ke daftar nama file yang diakhiri 1, yang mencakup tidak hanya file1tetapi juga file11(yang diurutkan setelahnya dalam urutan leksikografis). Demikian juga *2memperluas ke file12dan file2(dalam urutan ini). Jadi Anda mendapatkan echo, file1, file11, file12, file2, dan kemudian wildcard lain yang cocok satu file: file3, file4, ..., file12.

¹ Di samping yang terakhir, jika Anda mengikuti deskripsi manual, tetapi “penghapusan kutipan” sebenarnya bukan hal - kutipan diurai lebih awal dari proses ekspansi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.