コマンドを環境に関連付ける推奨される方法は?

コマンドを環境に関連付ける推奨される方法は?

実行時に PATH を検索して依存関係を探すソフトウェア (再コンパイルする権限や忍耐力がない) を使用することがありますが、これらの依存関係は、私が PATH に望むものと互換性がありません。たとえば、私はクラスターで python 3 を記述することが多く、 などの c3 コマンドを使用したい場合がありますcexecが、c3 では PATH の最初の python が 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);
}

関連情報