Không có bất ngờ khó chịu - hành vi mặc định tắt chỉ có ở đó để tương thích với cú pháp mẫu truyền thống, tuân thủ tiêu chuẩn.
Đó là để nói: Có thể (mặc dù không chắc) mà người viết fo+(o).*
thực sự có ý định các +
và ngoặc được đối xử như các bộ phận đen của mô hình kết hợp bởi mã của họ. Đối với bash để diễn giải biểu thức này theo cách khác với thông số POSIX sh sẽ là phá vỡ tính tương thích, được thực hiện theo mặc định trong rất ít trường hợp (echo -e
với xpg_echo
không được đặt là chỉ có ý tưởng ngay lập tức) .
Điều này khác với trường hợp thông thường khi mở rộng bash là hành vi mở rộng không xác định theo tiêu chuẩn POSIX - trường hợp vỏ POSIX cơ sở thường ném lỗi, nhưng thay vào đó, bash cung cấp một số hành vi được ghi lại mới và khác - bởi vì sự cần thiết phải xử lý các ký tự này giống như chúng được xác định bởi POSIX.
Để báo the relevant part of the specification, với sự nhấn mạnh thêm:
Một nhân vật bình thường là một mô hình đó sẽ phù hợp với bản thân. Có thể là bất kỳ ký tự nào trong bộ ký tự được hỗ trợ ngoại trừ NUL, các ký tự đặc biệt trong Quoting yêu cầu trích dẫn và ba ký tự mẫu đặc biệt sau. Kết hợp phải dựa trên mẫu bit được sử dụng để mã hóa ký tự, không phải trên biểu diễn đồ họa của ký tự. Nếu bất kỳ ký tự nào (thông thường, đặc biệt vỏ hoặc mẫu đặc biệt) được trích dẫn, mẫu đó phải khớp với chính ký tự đó. Các ký tự đặc biệt của shell luôn yêu cầu trích dẫn.
Khi không thể viện chứng và bên ngoài một biểu thức khung, ba nhân vật dưới đây được ý nghĩa đặc biệt trong đặc tả của mô hình:
?
- Một dấu hỏi là một mô hình đó sẽ phù hợp với bất kỳ ký tự.
*
- Dấu hoa thị là mẫu phải khớp với nhiều ký tự, như được mô tả trong Patterns Matching Multiple Characters.
[
- Khung mở phải giới thiệu biểu thức khung mẫu.
Vì vậy, tiêu chuẩn đòi hỏi một cách rõ ràng bất kỳ ký tự phi NUL khác hơn ?
, *
hoặc [
hoặc những người được liệt kê ở những nơi khác như yêu cầu trích dẫn để phù hợp với bản thân. Hành vi của Bash khi tắt extglob theo mặc định cho phép nó phù hợp với tiêu chuẩn này trong cấu hình mặc định của nó.
Tuy nhiên, đối với kịch bản của riêng bạn và vỏ tương tác của riêng bạn, trừ khi bạn đang thực hiện một thói quen chạy mã viết cho POSIX sh với các mẫu bất thường bao gồm, cho phép extglob
thường là giá trị thực hiện.
Nguồn
2013-06-19 12:57:25
Giá trị/an toàn để đặt trong .bashrc của tôi? – hardcode57
@ hardcode57 Có. –