有时我发现自己使用的软件(我没有权限或耐心重新编译)在运行时搜索我的 PATH 寻找其依赖项,但这些依赖项与我希望的 PATH 不兼容。例如,我经常在集群上编写 python 3,有时我想使用 c3 命令,例如cexec
,但 c3 希望我的 PATH 中的第一个 python 是 python 2。
像这样指定所需的临时路径,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.
在我的 shell 配置中,这是解决打字问题的好方法,但这需要将相同的低级宏应用于需要该环境的所有内容。我想命令可以以一种更系统的方式持久地与环境相关联,这种方式不会破坏(这样的宏有时会表明它们在执行复杂命令时是黑客行为),并且不像容器/虚拟机那样是重量级的解决方案。这个问题有标准的解决方案吗?
答案1
在设置环境的可执行文件周围创建一个 sh(最好是破折号)包装器,然后执行目标:
#!/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);
}