总是打开 extglob 有危险吗?

Pet*_*ver 7 bash wildcards

如果我打开extglob做类似的事情

shopt -s extglob
rm !(*.html|*.txt) # remove everything except html and txt files
Run Code Online (Sandbox Code Playgroud)

extglob在这之后继续下去是不明智的吗?一直使用它有什么注意事项吗?

Gil*_*il' 15

不,这并不危险。该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
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一一个破坏与 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)*
Run Code Online (Sandbox Code Playgroud)

不兼容性足够良性,ksh 默认启用这些模式,并且可以使用默认选项 ( ./configure --enable-extended-glob-default)编译最新版本的 bash 。