¿Por qué la sustitución de comandos no funciona entre llaves, pero reemplazarla con el número real funciona?

1

Estoy usando el siguiente comando para intentar maximizar el número de núcleos en mi servidor:

for i in {1..`nproc --all`}; do while : ; do : ; done & done

Por alguna razón, solo usa un núcleo, a pesar de que mi servidor tiene dos. Si trato de reemplazar `nproc --all`con 2, funciona bien. ¿Por qué está pasando esto?

AndreasKralj
fuente

Respuestas:

2

La expansión de llaves se produce antes de la sustitución del comando. Este fragmento

{1..`nproc --all`}

no se expandirá como llave en absoluto. Cuando la sustitución del comando se expande a 2, se convierte en

{1..2}

pero ya es demasiado tarde para la expansión de llaves. El mismo problema sería si usaras una variable allí .


Esta sintaxis funciona:

for ((i=1; i<=`nproc --all`; i++)); do echo "$i"; done

o

for i in $(seq 1 "$(nproc --all)"); do echo "$i"; done

Ajuste el ciclo a sus necesidades. Tenga en cuenta en el último caso que usé en $(…)lugar de `…`porque este formulario se anida fácilmente .

Kamil Maciorowski
fuente