Tại sao echo phù hợp với một số tập tin hai lần?


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

Tôi không hiểu tại sao điều này lại xảy ra. Xin ai đó có thể giải thích?

Câu trả lời:


21

Niềng răng không phải là mẫu ký tự đại diện. Kiểm tra tài liệu về mở rộng bash : niềng răng được mở rộng rất sớm trong quy trình và các mẫu ký tự đại diện được mở rộng ở bước cuối cùng.

Ban đầu, lệnh bao gồm hai từ echo, *{1..12}. Sau khi mở rộng cú đúp, lệnh chứa 13 chữ: echo, *1, *2, ..., *12. Sau đó các mẫu ký tự đại diện được mở rộng. *1mở rộng đến danh sách các tên tệp kết thúc bằng 1, bao gồm không chỉ file1mà còn file11(được sắp xếp sau đó theo thứ tự từ điển). Tương tự như vậy *2mở rộng đến file12file2(theo thứ tự này). Vì vậy, bạn sẽ có được echo, file1, file11, file12, file2, và sau đó là ký tự đại diện khác mà xuất hiện một tập tin duy nhất: file3, file4, ..., file12.

¹ Next để cuối cùng, nếu bạn làm theo mô tả của người sử dụng, nhưng “loại bỏ quote” là không thực sự là một điều - dấu ngoặc kép được phân tích cú pháp sớm hơn so với quá trình mở rộng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.