
Иногда я обнаруживаю, что использую программное обеспечение (на перекомпиляцию которого у меня нет прав или терпения), которое просматривает мой PATH в поисках своих зависимостей во время выполнения, но эти зависимости несовместимы с тем, что я хочу видеть в PATH. Например, я часто пишу python 3 на кластере, для которого иногда хочу использовать команды c3, например cexec
, но c3 хочет, чтобы первым python в моем PATH был python 2.
Указание необходимого временного PATH, как это, PATH=/usr/bin cexec echo hello world
работает, но это слишком много печатать. Ввод чего-то вроде
C3PREFIX=/usr/bin
alias cexec=$C3PREFIX cexec
alias cname=$C3PREFIX cget
alias cname=$C3PREFIX cpush
alias cname=$C3PREFIX cnames
... for all such commands needing a special environment.
в моей конфигурации оболочки есть приемлемое решение проблемы с набором текста, но это требует применения того же низкоуровневого макроса ко всему, что требует этой среды. Я представляю, что команды могли бы быть постоянно связаны со средами более систематическим образом, который не сломается (такие макросы иногда показывают, что они являются хаками при выполнении сложных команд) и который не является таким тяжеловесным решением, как контейнер/виртуальная машина. Есть ли стандартное решение этой проблемы?
решение1
Создайте оболочку sh (предпочтительно dash) вокруг исполняемого файла, в котором вы настраиваете среду, а затем выполните цель:
#!/bin/sh
ENVVAR=envvar exec ./target "$@"
Dash довольно эффективен, и это добавляет всего около 0,0005 с ко времени запуска цели на моем компьютере.
Эквивалентная оболочка на языке C не будет намного быстрее:
#include <unistd.h>
int main(int argc, char *argv[])
{
setenv("ENVVAR", "envvar", 1);
execvp("./target", argv);
}