始终打开 extglob 有危险吗?

始终打开 extglob 有危险吗?

如果我开始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。

相关内容