为什么我不在bash中启用extglob?

har*_*e57 47 bash

我刚刚在这里找到了关于bash extglob shell选项: - 在unix/linux shell中进行模式匹配时如何使用反向或负向通配符?

所使用的所有答案shopt -s extglob也提到shopt -u extglob将其关闭.我为什么要把这么有用的东西转过来?确实,为什么不默认开启?据推测,它有可能带来一些令人讨厌的惊喜.这些是什么?

Cha*_*ffy 47

没有令人讨厌的意外 - 默认关闭行为只是为了兼容传统的,符合标准的模式语法.


也就是说:有可能(尽管不太可能)某人写作fo+(o).* 实际上是将其+和括号视为与其代码匹配的模式的文字部分.对于bash来解释这种表达以不同的方式比什么POSIX sh的规范要求将破坏兼容性,这是对现在默认在极少数情况下完成的(echo -expg_echo未设置在于立即想到的唯一的一个).

这与通常情况不同,其中bash扩展正在扩展POSIX标准未定义的行为- 基线POSIX shell通常会抛出错误的情况,但是bash反而提供了一些新的和不同的明确记录的行为 - 因为需要对待这些匹配的字符由POSIX定义.

引用规范的相关部分,重点是:

普通字符是一种自身匹配的模式.除了 NUL 之外,它可以是受支持字符集中的任何字符,引用中需要引用的那些特殊shell字符以及以下三个特殊模式字符.匹配应基于用于编码字符的位模式,而不是基于字符的图形表示.如果引用任何字符(普通,shell特殊或模式特殊),则该模式应与字符本身匹配.shell特殊字符总是需要引用.

当不带引号且在括号表达式之外时,以下三个字符在模式规范中应具有特殊含义:

因此,标准明确地需要比其他任何非NUL字符?,*[或与其他地方列出的为要求引述以匹配他们自己.Bash默认情况下关闭extglob的行为允许它在默认配置中符合此标准.


但是,对于您自己的脚本和您自己的交互式shell,除非您习惯于运行为包含异常模式的POSIX sh编写的代码,否则启用extglob通常是值得的.

  • 在我的.bashrc中设置值得/安全吗? (7认同)