Sunday, June 24, 2007

Bash "bug": mở rộng ký tự đại diện [a-z] liệt kê cả chữ hoa

Thực hành demo phần mở rộng ký tự đại diện (filename expansion) trên bash FC6/F7 thấy ... trật lất vì lệnh "ls [a-z]*" không chạy đúng và liệt kê cả tên file/thư mục chữ hoa. Tra lại trên Google thì thấy "bug" này được thảo luận mới đây trên maillist gnu.bash.bug. Nguyên nhân là khi thiết lập LANG=en_US.UTF-8 (để sử dụng tiếng Việt Unicode) các ký tự sẽ được sắp xếp theo locale theo thứ tự [aAbBcC...zZ], và điều này ảnh hưởng đến toàn bộ các tiện ích hệ thống sử dụng biểu thức chính tắc (regex) như ls, grep, sort. Điều này cũng đã được đề cập trong man page của bash (mấy ai đọc hết ;)) là thứ tự sắp xếp ký tự sẽ được quyết định bởi locale và thiết lập của biến LC_COLLATE. Cách để vẫn sử dụng được đúng thứ tự A-Za-z với các locale khác C là đặt lại biến LC_COLLATE trong profile:

export LC_COLLATE=C
Một kinh nghiệm khá thú vị!