我运行以下代码
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 中的错误。
以上是 {1..9} 的 Zsh 中的错误吗?
这不是一个错误,它在文字内部运行良好。您在这里遇到的麻烦{1..9}
是不是像*
is 这样的通配符表达式;正如您的 echo 示例所示,这是一个迭代扩展。因此,您的 zgrep 示例与您在命令行中键入每个备用版本完全相同,然后由于 man2 中没有以 zsh 开头的手册页,因此会出错。(它在找不到匹配项时出错,而不是与您的大括号序列扩展本质上相关的任何内容。)
另一方面,如果你这样做了:
zgrep -c compinit /usr/share/man/man[1-9]/zsh*
你会得到你期望的结果,因为[1-9]
它是一个普通的通配符表达式。
在 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]