Trong bash, nếu bạn làm điều này:Có một cách dễ dàng để thiết lập nullglob cho một glob
mkdir /tmp/empty
array=(/tmp/empty/*)
bạn thấy rằng array
hiện nay có một phần tử, "/tmp/empty/*"
, không không như bạn muốn. Rất may, điều này có thể tránh được bằng cách bật tùy chọn nullglob vỏ bằng shopt -s nullglob
Nhưng nullglob là toàn cầu, và khi chỉnh sửa một shell script hiện có, có thể phá vỡ mọi thứ (ví dụ, đã có người kiểm tra mã lối ra của ls foo*
để kiểm tra xem có là các tệp có tên bắt đầu bằng "foo"?). Vì vậy, lý tưởng, tôi muốn bật nó chỉ cho một phạm vi nhỏ - lý tưởng, một tên tập tin mở rộng. Bạn có thể tắt nó đi một lần nữa sử dụng shopt -u nullglob
Nhưng tất nhiên chỉ khi nó đã được vô hiệu hóa trước:
old_nullglob=$(shopt -p | grep 'nullglob$')
shopt -s nullglob
array=(/tmp/empty/*)
eval "$old_nullglob"
unset -v old_nullglob
làm cho tôi nghĩ rằng phải có một cách tốt hơn. Rõ ràng "đặt nó trong một subshell" không hoạt động như tất nhiên chuyển nhượng biến chết với subshell. Ngoài waiting for the Austin group để nhập cú pháp ksh93, phải không?
Điều này khá tốt. Nó sẽ thất bại nếu tên tập tin có dòng mới trong chúng, nhưng mặc dù được cho phép, nó khá hiếm. Miễn là tên tập tin không nằm dưới sự kiểm soát của kẻ tấn công. – derobert
Có, dòng mới trong tên tệp tồn tại. Thông thường, điều đó chỉ có nghĩa là "tìm ra thủ phạm và trừng phạt người đó". Ngoại trừ rằng thời gian duy nhất tôi nhìn thấy dòng mới trong tên tập tin, thủ phạm là một phụ nữ lớn tuổi quyến rũ ... – mivk