我将我的脚本条带化为以下内容:
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
答案 0 :(得分:5)
如果启用了extglobs,则此代码仅在语法上有效。使用shopt -s extglob
启用它们:
shopt -s extglob
search() {
grep foobar ~/!(test1|test2)
}
据推测,你的init文件已经运行了这个命令(这样,你的交互式会话最终开启了extglobs),但在函数的定义之后。