gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:40:57 25 4
gpt4 key购买 nike

我刚刚在这里发现了 bash extglob shell 选项:- How can I use inverse or negative wildcards when pattern matching in a unix/linux shell?

所有使用 shopt -s extglob 的答案也提到 shopt -u extglob 将其关闭。我为什么要关闭如此有用的东西?确实为什么默认情况下不启用它?据推测,它有可能带来一些令人讨厌的惊喜。它们是什么?

最佳答案

没有令人讨厌的惊喜——默认关闭行为只是为了与传统的、符合标准的模式语法兼容。


也就是说:有人写 fo+(o).* 是有可能的(尽管不太可能) 实际打算 +括号被视为与其代码匹配的模式的文字部分。对于 bash 以不同于 POSIX sh 规范要求的方式解释此表达式将破坏兼容性,目前在极少数情况下默认情况下会这样做( echo -expg_echo unset 是唯一出现的情况立即想到)。

这不同于 bash 扩展根据 POSIX 标准扩展行为 undefined 的通常情况——基线 POSIX shell 通常会抛出错误,但 bash 提供了一些新的和不同的明确记录的行为——因为需要将这些字符视为匹配它们自己是由 POSIX 定义的。

引用the relevant part of the specification , 并强调:

An ordinary character is a pattern that shall match itself. It can be any character in the supported character set except for NUL, those special shell characters in Quoting that require quoting, and the following three special pattern characters. Matching shall be based on the bit pattern used for encoding the character, not on the graphic representation of the character. If any character (ordinary, shell special, or pattern special) is quoted, that pattern shall match the character itself. The shell special characters always require quoting.

When unquoted and outside a bracket expression, the following three characters shall have special meaning in the specification of patterns:

  • ? - A question-mark is a pattern that shall match any character.
  • * - An asterisk is a pattern that shall match multiple characters, as described in Patterns Matching Multiple Characters.
  • [ - The open bracket shall introduce a pattern bracket expression.

因此,该标准明确要求除 ? 之外的任何非 NUL 字符, *[或其他地方列出的需要引用以匹配自身的那些。 Bash 默认关闭 extglob 的行为使其在默认配置中符合此标准。


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

关于bash - 为什么我不在 bash 中启用 extglob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17191622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com