将命令与环境关联起来的推荐方法?

将命令与环境关联起来的推荐方法?

有时我发现自己使用的软件(我没有权限或耐心重新编译)在运行时搜索我的 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);
}

相关内容