为什么我在zsh中使用{1..9}会出现此错误?

Léo*_* 준영 9 shell zsh expansion

我运行以下代码

zgrep -c compinit /usr/share/man/man{1..9}/zsh*
Run Code Online (Sandbox Code Playgroud)

我明白了

zsh: no matches found: /usr/share/man/man2/zsh*
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为以下工作

echo Masi{1..9}/masi
Run Code Online (Sandbox Code Playgroud)

这表明我的问题可能是Zsh中的一个错误.

以上是Zsh中{1..9}的错误吗?

cha*_*aos 10

这不是一个bug,它在单词内部工作正常.你在这里遇到的麻烦是,这{1..9}不是一个通配符表达式*; 正如你的echo示例所示,它是一个迭代扩展.因此,您的zgrep示例与您在命令行中键入每个备用版本完全相同,然后由于在man2中没有以zsh开头的手册页,因此它会出错.(这是因为找不到匹配而错误,而不是与支撑序列扩展有任何内在联系.)

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

zgrep -c compinit /usr/share/man/man[1-9]/zsh*
Run Code Online (Sandbox Code Playgroud)

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

  • @Masi:不太好.如果我有一个目录1-hello.gif,2-world.gif,...,20-foobar.gif,`{1..20} - *.gif`可以很好地匹配它们,而` [1-20] - *.gif`只匹配前两个.但是,如果缺少任何顺序编号的文件,这将导致与您的问题中相同的错误. (2认同)

Rob*_*ens 8

在zsh中,如果你想在文件名中使用范围,那么zl​​e <1-n>可以扩展任何实名.也就是说:

$ touch a0b a1b a5b a7b
$ print a<0-100>b
Run Code Online (Sandbox Code Playgroud)

然后<Tab>在决赛之后立即命中b,让你在线上print a0b a1b a5b a7b扩大.

对于所有其他意图和目的 - 可能是全范围要求,非文件和脚本使用 - 我使用相当简洁的惯用zsh循环表达:

for n ({1..50}); do print $n; done
Run Code Online (Sandbox Code Playgroud)

将允许您处理数字1到50的整个序列范围:)之后您可以执行各种有用的操作,例如尚不存在的文件集合:

arr=($(for n ({1..50}); do print /my/path/file$n.txt; done)) && print $arr[33]
Run Code Online (Sandbox Code Playgroud)