Làm thế nào để âm thầm có được một chuỗi rỗng từ một mẫu toàn cầu không có kết quả khớp


24

Nói rằng tôi có một thư mục có ba tệp:

foo1
foo2
bar

1. Nếu tôi chạy

list_of_files=$(print foo*)
echo $list_of_files

Tôi có: foo1 foo2

2. Nếu tôi chạy

list_of_files=$(print bar*)
echo $list_of_files

Tôi có: bar

3. Tuy nhiên, nếu tôi chạy

list_of_files=$(print other*)
echo $list_of_files

Tôi nhận được: zsh: no matches found: other*( $list_of_filesmặc dù biến là trống)


Có cách nào để yêu cầu zsh không khiếu nại nếu nó không phù hợp với việc mở rộng toàn cầu không?

Mục tiêu của tôi là sử dụng cơ chế trên để âm thầm thu thập danh sách các tệp khớp với một mẫu hình cầu nhất định.

Câu trả lời:


33

Bật null_globtùy chọn cho mẫu của bạn với Nvòng loại toàn cầu.

list_of_files=(*(N))

Nếu bạn đang thực hiện việc này trên tất cả các mẫu trong tập lệnh hoặc hàm, hãy bật null_globtùy chọn:

setopt null_glob

Câu trả lời này có tương đương bash và ksh.

Không sử dụng printhoặc thay thế lệnh! Điều đó tạo ra một chuỗi bao gồm các tên tệp có khoảng trắng giữa chúng, thay vì một danh sách các chuỗi. (Xem phần tách từ là gì? Tại sao nó quan trọng trong lập trình shell? )


15

Cách tốt hơn : for a in *(.N); do ... ; done. Tùy chọn N làm cho zsh cung cấp một danh sách trống cho và sẽ lặp lại 0 lần.

Coi chừng ls *.foo(.N); Khi ls nhận được một danh sách đối số trống, nó sẽ liệt kê tất cả các tệp thay vì không có. Đây là lý do tại sao tôi không thích NULL_GLOB (hoặc tương đương với bash của nó): Nó thay đổi tất cả các khối và dễ dàng phá vỡ các cuộc gọi thành ví dụ như ls.


Fancy thấy câu trả lời của bạn ở đây @arnt, đây chỉ là những gì tôi cần.
gtd

Tại sao .trong (.N)? Các câu trả lời khác có một (N)mình, sự khác biệt là gì?
Michael Dorst

Câu hỏi là về các tệp và .giới hạn toàn cầu chỉ khớp với các tệp.
arnt

4

Tôi nghĩ rằng bạn đang tìm kiếm NULL_GLOBtùy chọn:

   NULL_GLOB (-G)
          If a pattern for filename generation has no matches, delete  the
          pattern  from  the  argument list instead of reporting an error.
          Overrides NOMATCH.

-1

Hãy thử cách này:

list_of_files=$(print other*) 2>/dev/null

Nó sẽ chuyển hướng đầu ra lỗi từ stderr sang / dev / null và nó sẽ không hiển thị.


Điều đó không làm việc cả.
Pablo Olmos de Aguilera C.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.