Nếu tôi bật extglob
để làm những việc như
shopt -s extglob
rm !(*.html|*.txt) # remove everything except html and txt files
Có phải là không khôn ngoan để tiếp tục extglob
sau này? Có bất kỳ cảnh báo về việc có nó trên tất cả các thời gian?
Nếu tôi bật extglob
để làm những việc như
shopt -s extglob
rm !(*.html|*.txt) # remove everything except html and txt files
Có phải là không khôn ngoan để tiếp tục extglob
sau này? Có bất kỳ cảnh báo về việc có nó trên tất cả các thời gian?
Câu trả lời:
Không, nó không nguy hiểm. Các extglob
tùy chọn không làm tăng nguy cơ vô tình gây thiệt hại. Lý do duy nhất mà nó không được bật theo mặc định là vì khả năng tương thích ngược với các phiên bản bash trước đó và thậm chí sau đó, các trường hợp phá vỡ tính tương thích là khá xa, bởi vì hầu hết những gì extglob
cho phép là lỗi cú pháp nếu không được đặt do dấu ngoặc đơn mở xảy ra trong một từ.
$ bash -c $'echo /@(u|v)*'
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `echo /@(u|v)*'
$ bash -c $'shopt -s extglob\necho /@(u|v)*'
/usr /var
Trường hợp duy nhất tôi có thể nghĩ về nơi nó phá vỡ tính tương thích với bash -without-extglob và POSIX sh là khi một mẫu được mở rộng từ một biến. Các mẫu extglob là không bình thường trong tên tệp, vì vậy điều này không có khả năng là một vấn đề trong thực tế.
$ bash -c $'shopt -s extglob\necho $0' '/@(u|v)*'
/usr /var
$ bash -c $'echo $0' '/@(u|v)*'
/@(u|v)*
Sự không tương thích đủ lành tính để ksh có các mẫu này được bật theo mặc định và các phiên bản bash gần đây có thể được biên dịch với tùy chọn bật theo mặc định ( ./configure --enable-extended-glob-default
).