Tôi đã thấy rằng việc thiết lập extglob
tùy chọn hệ vỏ trong hợp chất hỗn hợp sẽ dẫn đến sự thất bại của các phản ứng tiếp theo. Các tùy chọn shell có bắt buộc phải được đặt bên ngoài các lệnh ghép không? Tôi không thấy một dấu hiệu nào về yêu cầu như vậy trong các trang bash man.
Ví dụ, tập lệnh sau hoạt động tốt (bản in a.0 a.1
):
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
shopt -s extglob
ls "a."!(b*)
Tuy nhiên, nếu hai dòng cuối cùng được thực thi dưới dạng lệnh ghép, tập lệnh sẽ thất bại với lỗi sau:
syntax error near unexpected token `('
` ls "a."!(b*)'
Điều này đã được thử nghiệm bằng các phiên bản bash từ 4.2 đến 4.4 và với một loạt các lệnh ghép :
(1) có điều kiện - if
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
if true; then
shopt -s extglob
ls "a."!(b*)
fi
(2) niềng răng - { }
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
{
shopt -s extglob
ls "a."!(b*)
}
(3) subshell - ( )
:
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
(
shopt -s extglob
ls "a."!(b*)
)
Trong mọi trường hợp, nếu shopt
được di chuyển bên ngoài lệnh ghép, tập lệnh thành công.