
Если у вас есть 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/directory
for custom wrappers. Теперь у вас есть два варианта:
По требованию:
PATH="/special/directory:$PATH" nproc=1 ./test.sh
Постоянный. Измените свой
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