我目前无法复制下面描述的结果,有关详细信息,请参阅my answer below。
anonymous editor suggested将bash
代码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
因此,给定否 {?
,*
,+
,@
或!
}的前导字符:
这些主要运营商提供的任何功能是否与(..|..)
中bash
的功能相同?
如果没有,并且(..|..)
在bash
中做了不同的事情,那么会做什么
是否有任何其他炮弹(例如zsh
,ksh
等),提供有效的(..|..)
? (如果是这样,那些炮弹如何记录它?)
答案 0 :(得分:0)
这是一个虚拟答案&#34;,因为我无法复制我初步测试的结果。目前,无论是在线测试人员noted by George Vasiliou还是我自己的在线测试,以及我的家庭系统上的测试,echo ${s//(*\/|.*)}
仅打印/the/path/foo.txt
。
关于为什么会这样的一些理论:
我的初始Q可能是错误发布的,也许是副本&amp;粘贴错误,bash
历史错误,以及对结果的粗心阅读使得只有似乎表明结果是真实的。通常我只需向后滚动lxterminal
屏幕缓冲区并检查,从而确认或揭穿Q.
不幸的是,由于最近的一些升级,我的笔记本电脑的暂停功能在过去几天变得相当不稳定,并且所需的回滚缓冲区因失败的非暂停而丢失。我也无法找到与首次发布此Q的时间相对应的命令历史记录部分。
最近的一次升级可能改变了bash
或bash
的某些依赖关系。这似乎不太可能,因为看看grep bash /var/log/dpkg.log
显示bash
自 5/24 以来已经升级,远在此Q发布之前。
在Q发布时和现在之间更改了一些重要的配置选项。
因此,我更倾向于谨慎行事,并在SE允许的情况下将此Q标记为已解答 - 如果有人设法管理,则可以随时更改复制Q结果。