Các giới hạn phạm vi để thiết lập extglob shopt là gì. và các lựa chọn khác?


8

Vỏ bash không tương tác của tôi có extglob off. Tôi muốn bật nó trong câu lệnh ngay trước một lệnh, nhưng tôi nhận thấy rằng khi shopt -s extglobở trong một if .. then .. elsekhối, bằng cách nào đó nó không đăng ký.

Lệnh phụ thuộc extglob sau đây không hợp lệ : syntax error near unexpected token '('.

Nơi nào có thể extglobđược đặt, và tại sao có một hạn chế, ở tất cả? Điều này áp dụng cho các lựa chọn khác? ... GNU bash 4.1.5

Những công việc này:

shopt -s extglob
if true ;then
    touch a.bcd; ls a.@(bcd)
fi

Điều này không thành công:

if true ;then
    shopt -s extglob
    touch a.bcd; ls a.@(bcd)
fi
... line 17: syntax error near unexpected token `('
... line 17: `touch a.bcd; ls a.@(bcd)' 

Câu trả lời:


14

Không chắc chắn nếu có một nguồn có thẩm quyền hơn (ví dụ: trang man / tài liệu chính thức) về vấn đề này, nhưng tôi đã tìm thấy một trang web giải thích hành vi này: http://mywiki.wooledge.org/glob

Vì tùy chọn extglob thay đổi cách phân tích một số ký tự nhất định, nên cần phải có một dòng mới (không chỉ là dấu chấm phẩy) giữa lệnh shopt và bất kỳ lệnh nào sau đó sử dụng các chuỗi mở rộng. Tương tự như vậy, bạn không thể đặt extglo của shopt trong một khối câu lệnh sử dụng các khối lượng mở rộng, bởi vì toàn bộ khối phải được phân tích cú pháp khi được định nghĩa; lệnh shopt sẽ không có hiệu lực cho đến khi khối được đánh giá, tại thời điểm đó là quá muộn. Trong thực tế khi bash phân tích toàn bộ khối lệnh trước khi đánh giá bất kỳ khối nào, bạn cần đặt extglob bên ngoài khối ngoài cùng.


1
Cảm ơn. Các liên kết len bao gồm nó khá tốt. Tôi cho rằng nó phải bị áp đặt theo cách đó vì một số vấn đề di sản.
Peter.O

@ Peter.OI sẽ nói rằng đó là vì trình phân tích cú pháp của bash rất khó. Tất nhiên, tôi là một người dùng zsh bẩn thỉu, ngoại trừ việc tôi dường như nhớ đây là lý do chính thức được đưa ra trong danh sách gửi thư bash. Bash có rất nhiều vấn đề phân tích tương tự, chẳng hạn như alias e=echo; e hellokhông hoạt động: định nghĩa bí danh chỉ diễn ra trên dòng mới tiếp theo.
Gilles 'SO- ngừng trở nên xấu xa'

Điều đó thật thú vị, cảm ơn ... Một ngày nọ, tôi sẽ đi xung quanh khi nhìn vào zsh. Nó dường như có tất cả các chuông và còi; những cái rất nhỏ gọn.
Peter.O
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.