
有時我發現自己使用的軟體(我沒有權限或耐心重新編譯)在運行時搜尋我的 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);
}