〜/!(test1 | test2)在bashrc中导致语法错误,在命令行中工作

时间:2016-10-12 16:38:23

标签: bash

我将我的脚本条带化为以下内容:

search() {
    grep foobar ~/!(test1|test2)
}

非常直截了当。我想创建一个grep文本foobar的过程,但不要在test1或test2文件夹中grep

如果我只是在bash命令行中运行它,它按预期工作(!)。创建过程并可以调用:

boyang@vbox-ubuntu:~$ search
grep: /home/boyang/Code/analytics.jpg: Is a directory
/home/boyang/Code/bash_includes:    grep foobar ~/Code/!(test1|test2)

如果我把它放在脚本中(例如bash_includes),并在.bashrc中提供它:

if [ -f ~/bash_includes ]; then
    . ~/bash_includes
fi

它给出了:

bash: /home/boyang/bash_includes: line 2: syntax error near unexpected token `('
bash: /home/boyang/bash_includes: line 2: `    grep foobar ~/!(test1|test2)'

我尝试添加shebang,尝试添加引号("~/!(test1|test2)"'~/!(test1|test2)'\`~/!(test1|test2)\`)。什么都不行

我不是bash专家,但这令人费解。我错过了什么?

Ubuntu 14.04 Bash 4.3.11(1)-release

1 个答案:

答案 0 :(得分:5)

如果启用了extglobs,则此代码仅在语法上有效。使用shopt -s extglob启用它们:

shopt -s extglob
search() {
    grep foobar ~/!(test1|test2)
}

据推测,你的init文件已经运行了这个命令(这样,你的交互式会话最终开启了extglobs),但函数的定义之后。