Как настроить nproc для одной команды?

Как настроить nproc для одной команды?

Если у вас есть test.shсодержащий

make -j$(nproc)

Как можно временно настроить nproc, по примеру nproc=1 ./test.sh?

решение1

Создайте оболочку, которая печатает $nproc:

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

Назовите его nproc, сделайте его исполняемым ( chmod +x nproc) и поместите его в ваши /special/directoryfor custom wrappers. Теперь у вас есть два варианта:

  1. По требованию:

    PATH="/special/directory:$PATH" nproc=1 ./test.sh
    
  2. Постоянный. Измените свой PATHтак, чтобы /special/directoryон всегда был там как первая запись. Тогда вы можете просто

    nproc=1 ./test.sh
    

Примечания:

  • Если скрипт изменяет (сбрасывает, очищает) свой PATH, решение может не сработать.
  • Если переменная пуста или не установлена, оболочка использует реальный nprocпуть (по его полному пути, чтобы избежать рекурсивного вызова самой себя). Этот способ nprocбудет вести себя точно так же, как и раньше, если только вы не установите переменную в любое непустое значение.
  • В вашем примере $(nproc)не кавычки. Это означает, что вы можете ввести дополнительные параметры через переменную (например nproc="2 -i", оболочка выведет эту строку, в скрипте она будет разделена на два слова и -iпередана в make). Вы можете

    • Воспользуйтесь этим и используйте переменную для фактического внедрения опций (хакерский подход, не рекомендуется);
    • всегда проверяйте, что переменная является разумной;
    • реализовать некоторую логику в оболочке, чтобы уменьшить вероятность разделения ее вывода; пример:

      set -- $nproc
      printf '%s\n' "$1"
      # word splitting done in the wrapper, only the first word is printed
      
    • (правильное решение) исправить скрипт:

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

решение2

Если test.shэто скрипт bash, то другим способом может быть экспорт функции с именем nproc:

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

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

Создание и экспорт функции:

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

Связанный контент