我发现extglob
在复合化合物中设置shell选项会导致后续的抗glob失败。是否需要在复合命令之外设置外壳程序选项?在bash手册页中没有看到这样要求的指示。
例如,以下脚本可以正常工作(打印a.0 a.1
):
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
shopt -s extglob
ls "a."!(b*)
但是,如果最后两行作为复合命令执行,则脚本将失败,并出现以下错误:
syntax error near unexpected token `('
` ls "a."!(b*)'
使用4.2到4.4的bash版本以及各种复合命令对此进行了测试:
(1)有条件的- 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)大括号- { }
#!/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*)
)
在所有情况下,如果将shopt
移到复合命令之外,则脚本将成功。