9

我运行以下代码

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 中的错误吗?

4

2 回答 2

11

这不是一个错误,它在文字内部运行良好。您在这里遇到的麻烦{1..9}是不是像*is 这样的通配符表达式;正如您的 echo 示例所示,这是一个迭代扩展。因此,您的 zgrep 示例与您在命令行中键入每个备用版本完全相同,然后由于 man2 中没有以 zsh 开头的手册页,因此会出错。(它在找不到匹配项时出错,而不是与您的大括号序列扩展本质上相关的任何内容。)

另一方面,如果你这样做了:

zgrep -c compinit /usr/share/man/man[1-9]/zsh*

你会得到你期望的结果,因为[1-9]它是一个普通的通配符表达式。

于 2009-04-30T04:49:46.040 回答
11

在 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]
于 2014-08-09T22:54:50.110 回答