Pregunta

Ejecuto el siguiente código

zgrep -c compinit /usr/share/man/man{1..9}/zsh*

me sale

zsh: no matches found: /usr/share/man/man2/zsh*

Esto es extraño, ya que lo siguiente funciona

echo Masi{1..9}/masi

Esto me sugiere que el problema puede ser un error en Zsh.

¿Es lo anterior un error en Zsh para {1..9}?

¿Fue útil?

Solución

No es un error, y funciona bien dentro de las palabras. El problema que está teniendo aquí es que {1..9} no es una expresión comodín como lo es *; Como muestra su ejemplo de eco, es una expansión iterativa. Por lo tanto, su ejemplo de zgrep es exactamente el mismo que si hubiera escrito cada versión alternativa en la línea de comando, y como no hay páginas de manual que comiencen con zsh en man2, se produce un error. (Se está produciendo un error al no encontrar una coincidencia, no hay nada intrínsecamente relacionado con la expansión de su secuencia de llaves).

Si hiciste esto, por otro lado:

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

obtendría los resultados que espera, porque [1-9] es una expresión comodín normal.

Otros consejos

En zsh, si desea utilizar rangos en nombres de archivo, zle ofrece <1-n> en cualquier nombre real sobre el que pueda expandirse. Es decir:

$ touch a0b a1b a5b a7b
$ print a<0-100>b

Y luego presione <Tab> justo después de que el b final lo deje con print a0b a1b a5b a7b expandido en la línea.

Para todos los demás propósitos, tal vez requisitos de rango completo, uso de archivos y secuencias de comandos, expresaría esto usando el bucle zsh idiomático bastante sucinto como:

for n ({1..50}); do print $n; done

Le permitirá procesar todo el rango de secuencia de los números del 1 al 50 :) después de lo cual puede hacer todo tipo de cosas útiles, como una colección de archivos que aún no existe:

arr=($(for n ({1..50}); do print /my/path/file$n.txt; done)) && print $arr[33]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top