¿Cómo configurar nproc para un solo comando?

¿Cómo configurar nproc para un solo comando?

Si tiene un test.shcontenido

make -j$(nproc)

¿Cómo podrías ajustar temporalmente nproc, en la línea de nproc=1 ./test.sh?

Respuesta1

Crea un contenedor que imprima $nproc:

#!/bin/sh
[ -z "$nproc" ] && exec /usr/bin/nproc "$@"
printf '%s\n' "$nproc"

Nómbrelo nproc, hágalo ejecutable ( chmod +x nproc) y colóquelo en sus /special/directorycontenedores personalizados. Ahora, tú tienes dos opciones:

  1. Bajo demanda:

    PATH="/special/directory:$PATH" nproc=1 ./test.sh
    
  2. Permanente. Modifica tu PATHpara que /special/directorysiempre esté ahí como primera entrada. Entonces puedes simplemente

    nproc=1 ./test.sh
    

Notas:

  • Si el script altera (restablece, desinfecta) su contenido PATH, es posible que la solución no funcione.
  • Si la variable está vacía o no está configurada, el contenedor usa el valor real nproc(por su ruta completa para evitar llamarse a sí mismo de forma recursiva). De esta manera nprocse comportará exactamente como antes, a menos que establezca la variable en cualquier valor que no esté vacío.
  • En su ejemplo $(nproc)no se cita. Esto significa que puede inyectar opciones adicionales a través de la variable (por ejemplo nproc="2 -i", el contenedor imprimirá esta cadena, en el script se dividirá en dos palabras y -ise pasará a make). Puedes

    • aproveche esto y use la variable para inyectar opciones (truco, no recomendado);
    • asegúrese siempre de que la variable sea correcta;
    • implementar algo de lógica en el contenedor, por lo que es menos probable que su salida se divida; ejemplo:

      set -- $nproc
      printf '%s\n' "$1"
      # word splitting done in the wrapper, only the first word is printed
      
    • (solución adecuada) corrija el script:

      make -j"$(nproc)"
      # if the wrapper prints unexpected string, make will comply
      

Respuesta2

Si test.shse trata de un script bash, otra forma podría ser exportar una función denominada nproc:

bash-5.0$ cat foo.sh
#! /bin/bash

echo make -j $(nproc)
bash-5.0$ ./foo.sh
make -j 8

Crear y exportar una función:

bash-5.0$ nproc() { echo function 10; }
bash-5.0$ (export -f nproc; ./foo.sh)
make -j function 10

información relacionada