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 failglob
tù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 ls
mà không có đối số, vì vậy hãy liệt kê thư mục hiện tại. cshnullglob
tố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ỡ bash
sẽ 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 zsh
và bash
, bạn có thể sử dụng các khối ksh ( set -o kshglob
trong zsh
và shopt -s extglob
trong bash
).
Sau đó, bạn sẽ làm:
ls -d ./foldername/*.@(a|b|)test
hoặc là:
ls -d ./foldername/*.?([ab])test
Thêm failglob
tùy chọn vào bash
để tránh quả cầu được truyền theo nghĩa đen ls
khi 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
?