【问题标题】:Why does pattern "*.so?(.*)" produce a syntax error in a script but not on command line?为什么模式“*.so?(.*)”会在脚本中产生语法错误,但不会在命令行中产生?
【发布时间】:2015-06-09 14:31:00
【问题描述】:

该模式有点不寻常,因为我添加了尾随的“?(。*)”部分。它像我预期的那样在命令行上工作,但我在脚本中遇到语法错误。

$ bash --version
GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)
...
$ cat x.sh
touch a.so a.so.1
ls *.so?(.*)
rm *.so?(.*)
$ touch a.so a.so.1
$ ls *.so?(.*)
a.so  a.so.1
$ rm *.so?(.*)
$ ls
x.sh
$ bash x.sh
x.sh: line 2: syntax error near unexpected token `('
x.sh: line 2: `ls *.so?(.*)'
$

【问题讨论】:

    标签: bash shell syntax


    【解决方案1】:

    您正在使用扩展的 glob,但默认情况下在脚本中未启用这些。为了使用它们,必须明确启用它们。您可以通过在该行之前添加以下内容来做到这一点:

    shopt -s extglob
    

    要稍后在脚本中禁用它们,您可以使用shopt -u extglob

    正如chepner 正确指出的那样,默认情况下交互式shell 中也未启用此功能。大概,这条线出现在您的系统范围的启动脚本之一或您的个人脚本之一中。

    【讨论】:

    • 默认情况下它们在交互式 shell 中也没有启用;用户必须在某处的启动文件中有这一行。
    • 我怀疑是这种情况,但我不确定 - 我也会编辑以包含该信息,谢谢。
    • 我必须发布另一个问题askubuntu.com/q/634397/53613 才能得到答案。我的 Ubuntu 14.04 ~/.bashrc 来源 /etc/bash_completion 来源 /usr/share/bash-completion/bash_completion 执行“shopt -s extglob progcomp”。
    • @John 这对我来说似乎是一个单独的问题——这个问题是“为什么它在一个地方有效,而在另一个地方无效?”,我想我已经回答了。我认为另一个问题更适合Ask Ubuntu(假设您正在运行 Ubuntu),因为它是该发行版特有的细节。
    • 对不起,我并不是说我必须去 Ask Ubuntu 才能得到原始问题的答案(你已经回答了)。我的意思是我必须去 Ask Ubuntu 来回答 cmets 中提出的问题。也就是说,在我的特定配置中,extglob 是在哪里打开的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2016-11-19
    • 2011-07-28
    • 1970-01-01
    • 2019-03-04
    • 2018-06-17
    相关资源
    最近更新 更多