명령을 환경과 연결하는 권장 방법은 무엇입니까?

명령을 환경과 연결하는 권장 방법은 무엇입니까?

때로는 런타임에 종속성을 찾기 위해 PATH를 검색하는 소프트웨어(재컴파일할 권한이나 인내심이 없음)를 사용하고 있지만 이러한 종속성은 내가 원하는 PATH와 호환되지 않습니다. 예를 들어, 나는 종종 클러스터에 Python 3을 작성하는데, 때로는 와 같은 c3 명령을 사용하고 싶지만 cexecc3에서는 내 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(대시 선호) 래퍼를 만듭니다.

#!/bin/sh
ENVVAR=envvar exec ./target "$@"

Dash는 매우 효율적이며 내 컴퓨터의 대상 시작 시간에 약 .0005초만 추가됩니다.

동등한 C 래퍼는 그보다 훨씬 빠르지 않습니다.

#include <unistd.h>
int main(int argc, char *argv[])
{
       setenv("ENVVAR", "envvar", 1);
       execvp("./target", argv);
}

관련 정보