如果我开始extglob
做类似的事情
shopt -s extglob
rm !(*.html|*.txt) # remove everything except html and txt files
extglob
在此之后继续下去是不明智的吗?一直戴着它有什么注意事项吗?
答案1
不,这并不危险。该extglob
选项不会增加意外造成损坏的风险。默认情况下不启用它的唯一原因是为了向后兼容以前版本的 bash,即使如此,它破坏兼容性的情况也是相当牵强的,因为extglob
如果不启用的话,大多数启用都会出现语法错误由于单词中出现左括号而设置。
$ bash -c $'echo /@(u|v)*'
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `echo /@(u|v)*'
$ bash -c $'shopt -s extglob\necho /@(u|v)*'
/usr /var
我能想到的唯一破坏与 bash -without-extglob 和 POSIX sh 兼容性的情况是从变量扩展模式时。 extglob 模式在文件名中并不常见,因此这在实践中不太可能成为问题。
$ bash -c $'shopt -s extglob\necho $0' '/@(u|v)*'
/usr /var
$ bash -c $'echo $0' '/@(u|v)*'
/@(u|v)*
不兼容性非常良性,ksh 默认启用这些模式,并且可以使用默认选项 ( ./configure --enable-extended-glob-default
) 来编译最新版本的 bash。