我运行以下代码
zgrep -c compinit /usr/share/man/man{1..9}/zsh*
我得到了
zsh: no matches found: /usr/share/man/man2/zsh*
这很奇怪,因为以下工作
echo Masi{1..9}/masi
这表明我的问题可能是Zsh中的一个错误。
以上是Zsh中{1..9}的错误吗?
答案 0 :(得分:9)
这不是一个错误,它在单词内部正常工作。你在这里遇到的麻烦是{1..9}
不是像*
那样的通配符表达式;正如你的echo示例所示,它是一个迭代扩展。因此,您的zgrep示例与您在命令行中键入每个备用版本完全相同,然后由于在man2中没有以zsh开头的手册页,因此它会出错。 (这是因为找不到匹配而错误,而不是与支具序列扩展有任何内在联系。)
如果你这样做,另一方面:
zgrep -c compinit /usr/share/man/man[1-9]/zsh*
你会得到你期望的结果,因为[1-9]
是一个普通的通配符表达式。
答案 1 :(得分:7)
在zsh中,如果你想在文件名中使用范围,那么zle就可以展开的任何真实姓名提供<1-n>
。也就是说:
$ touch a0b a1b a5b a7b
$ print a<0-100>b
然后在最终<Tab>
之后立即点击b
,让print a0b a1b a5b a7b
扩展到该行。
对于所有其他意图和目的 - 可能是全范围要求,非文件和脚本使用 - 我使用相当简洁的惯用zsh循环表达:
for n ({1..50}); do print $n; done
将允许您处理数字1到50的整个序列范围:)之后您可以执行各种有用的操作,例如尚不存在的文件集合:
arr=($(for n ({1..50}); do print /my/path/file$n.txt; done)) && print $arr[33]