`(.. | ..)`的extglob默认行为?

时间:2017-05-28 17:09:55

标签: bash shell

注意:此Q可能是假的。

我目前无法复制下面描述的结果,有关详细信息,请参阅my answer below

anonymous editor suggestedbash代码echo ${s//+(*\/|.*)}替换为echo ${s//(*\/|.*)},(shopt -s extglob; s=/the/path/foo.txt},并且两者都生成相同的输出“ foo < / EM>”。

对于那些数据,它的工作原理是一样的(无论如何都在 Bash v4.3 上),但它是一样的吗?手册......

 man bash | grep -B 1 -A 20  'several extended pattern matching operators'

......似乎没有任何消息:

   If  the  extglob  shell  option  is  enabled  using the shopt
   builtin, several extended pattern matching operators are rec‐
   ognized.   In  the following description, a pattern-list is a
   list of one or more patterns separated  by  a  |.   Composite
   patterns  may  be  formed  using one or more of the following
   sub-patterns:

          ?(pattern-list)
                 Matches zero or one  occurrence  of  the  given
                 patterns
          *(pattern-list)
                 Matches  zero  or more occurrences of the given
                 patterns
          +(pattern-list)
                 Matches one or more occurrences  of  the  given
                 patterns
          @(pattern-list)
                 Matches one of the given patterns
          !(pattern-list)
                 Matches  anything  except one of the given pat‐
                 terns

因此,给定 {?*+@!}的前导字符:

  1. 这些主要运营商提供的任何功能是否与(..|..)bash的功能相同?

  2. 如果没有,并且(..|..)bash中做了不同的事情,那么会做什么

  3. 是否有任何其他炮弹(例如zshksh等),提供有效的(..|..)? (如果是这样,那些炮弹如何记录它?)

1 个答案:

答案 0 :(得分:0)

这是一个虚拟答案&#34;,因为我无法复制我初步测试的结果。目前,无论是在线测试人员noted by George Vasiliou还是我自己的在线测试,以及我的家庭系统上的测试,echo ${s//(*\/|.*)}仅打印/the/path/foo.txt

关于为什么会这样的一些理论:

  1. 我的初始Q可能是错误发布的,也许是副本&amp;粘贴错误,bash历史错误,以及对结果的粗心阅读使得只有似乎表明结果是真实的。通常我只需向后滚动lxterminal屏幕缓冲区并检查,从而确认或揭穿Q.

    不幸的是,由于最近的一些升级,我的笔记本电脑的暂停功能在过去几天变得相当不稳定,并且所需的回滚缓冲区因失败的非暂停而丢失。我也无法找到与首次发布此Q的时间相对应的命令历史记录部分。

  2. 最近的一次升级可能改变了bashbash的某些依赖关系。这似乎不太可能,因为看看grep bash /var/log/dpkg.log显示bash 5/24 以来已经升级,远在此Q发布之前。

    < / LI>
  3. 在Q发布时和现在之间更改了一些重要的配置选项。

  4. 因此,我更倾向于谨慎行事,并在SE允许的情况下将此Q标记为已解答 - 如果有人设法管理,则可以随时更改复制Q结果。