Trong
ls -d ./foldername/*.{a,b,}test
{a,b,...} không phải là nhà điều hành toàn cầu, đó là mở rộng cú đúp, lần đầu tiên được mở rộng thành:
ls -d ./foldername/*.atest ./foldername/*.btest ./foldername/*.test
Và mỗi quả cầu được mở rộng riêng lẻ và nếu bất kỳ quả cầu nào không khớp, lệnh sẽ bị hủy như bạn mong đợi zsh(hoặc fish; trong bash, bạn cần failglobtùy chọn để có hành vi tương tự).
Tại đây, bạn muốn sử dụng một quả cầu duy nhất khớp với tất cả các tệp đó và chỉ hủy lệnh nếu một quả cầu đó không khớp với bất kỳ tệp nào:
ls -d ./foldername/*.(a|b|)test
Bạn không muốn sử dụng nullglob, vì nếu không có bất kỳ khối nào phù hợp, nó sẽ chạy lsmà không có đối số, vì vậy hãy liệt kê thư mục hiện tại. cshnullglobtốt hơn về mặt đó vì nó loại bỏ các khối không phù hợp nhưng vẫn hủy lệnh nếu tất cả các khối không khớp.
Bạn sẽ không muốn sử dụng nonomatch, vì điều đó sẽ cho bạn hành vi bị phá vỡ bashsẽ là một sự xấu hổ.
Đối với một giải pháp thay thế toàn cầu hoạt động ở cả hai zshvà bash, bạn có thể sử dụng các khối ksh ( set -o kshglobtrong zshvà shopt -s extglobtrong bash).
Sau đó, bạn sẽ làm:
ls -d ./foldername/*.@(a|b|)test
hoặc là:
ls -d ./foldername/*.?([ab])test
Thêm failglobtùy chọn vào bashđể tránh quả cầu được truyền theo nghĩa đen lskhi nó không khớp.
Xem tại sao nullglob không được mặc định? để biết thêm thông tin.
/dev/null?