
Si tiene un test.sh
contenido
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/directory
contenedores personalizados. Ahora, tú tienes dos opciones:
Bajo demanda:
PATH="/special/directory:$PATH" nproc=1 ./test.sh
Permanente. Modifica tu
PATH
para que/special/directory
siempre esté ahí como primera entrada. Entonces puedes simplementenproc=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 maneranproc
se 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 ejemplonproc="2 -i"
, el contenedor imprimirá esta cadena, en el script se dividirá en dos palabras y-i
se pasará amake
). 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.sh
se 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