Tại sao tôi không thể sử dụng! (Mẫu đơn) trong zsh ngay cả sau khi tôi bật kshglob?


8

Điều này hoạt động trong bash:

touch a b c
echo !(a)

Nếu tôi thực thi tập lệnh trên trong zsh (với kshglobbật), nó sẽ phàn nàn:

zsh: number expected

Nếu tôi thêm |sau a, nó hoạt động:

echo !(a|)

Tại sao?

Câu trả lời:


10

Bởi vì trong trường hợp này, nó xung đột với vòng loại toàn cầu trần vì nó ở cuối mẫu. *(a1)được lấy làm tập tin truy cập lần cuối vào ngày cuối cùng. (a1)được coi là vòng loại toàn cầu. Vì vậy, trong !(a)trường hợp của bạn , zsh phàn nàn về số ngày bị thiếu saua vòng loại toàn cầu (ở đây áp dụng cho tệp được gọi !).

Trong các khối zsh, việc (...)phân nhóm chủ yếu được sử dụng cho (foo|bar)xen kẽ, vì vậy, thêm một |là một cách được ghi thành tài liệu để đảm bảo một dấu vết(...) không được coi là vòng loại toàn cầu.

Một cách khác được ghi lại là tăng gấp đôi dấu ngoặc đơn ( !((a))) hoặc bạn có thể thêm một vòng loại toàn cầu trống (như!(a)(-) ).

Để loại bỏ hoàn toàn sự mơ hồ đó, người ta có thể tắt bare_glob_qualtùy chọn ( set +o bareglobqual), sau đó, vòng loại toàn cầu phải được viết bằng extendedglob (#q...)cú pháp ( *(#qa1)tại đây).

Các kshglobtùy chọn ( thêm vào năm 1998 , khoảng thời bashbổ sung của nó extglobbash mặc dù không có bất kỳ glob mở rộng trước đó) là chủ yếu có cho kshchế độ thi đua ( emulate ksh), ví zshđể có thể chạy kshcác kịch bản, nơi kshglobđược kích hoạt và bareglobqualvô hiệu hóa. Khi được giới thiệu lần đầu tiên, sau khi kích hoạt kshglob, bạn cần chỉ định vòng loại toàn cầu -(...)để tránh loại xung đột đó nhưng điều đó gây ra quá nhiều nhầm lẫn và xung đột với @-(...)cú pháp của ksh93, (#q...)bareglobqual các tùy chọn được giới thiệu sau.

zshngười dùng thường thích glob mở rộng riêng zsh của ( set -o extendedglob) khai thác được dễ dàng hơn để gõ (đối với hầu hết) và mạnh hơn (so với ksh88 những kích hoạt với kshglobcũng được tìm thấy trong bash -O extglob).

Ví dụ, !(foo)sẽ được viết ^foo. Các !(foo|)bartuy nhiên tương đương sẽ dài như (^(foo|))bar.

Bản dịch ksh88 -> zsh khác:

  • *(x) -> x#
  • +(x) -> x##
  • @(x|y) -> x|y
  • ?(x) -> (x|)

Một số bản dịch ksh93 -> zsh:

  • ~(i:x)-> (#i)x(trường hợp không nhạy cảm)
  • ~(N)x-> x(N)(nullglob, có nguồn gốc từ zsh)
  • {1,5}(x) -> x(#c1,5)
  • @(foo&bar)-> foo~^barhoặc^(^foo|^bar)

Một số chỉ được tìm thấy trong zsh:

  • <1-23> (phạm vi số thập phân)
  • pattern~except
  • pattern(glob-qualifier) (tính năng sát thủ của zsh globs)
  • (pattern/)#(bất kỳ cấp thư mục con nào phù hợp với pattern; **/phiên bản đơn giản hóa (*/)#cũng đã được thêm vào ksh93 và bash gần đây)
  • ***/* (đệ quy đệ quy theo symlink).
  • (#a1)foobar (khớp gần đúng, cho phép một số lỗi, ở đây 1)
  • ...
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.