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

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

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

내 셸 구성에서 이는 입력 문제를 해결하는 좋은 방법이지만 해당 환경이 필요한 모든 항목에 동일한 하위 수준 매크로를 적용해야 합니다. 명령은 중단되지 않고(이러한 매크로는 복잡한 명령을 실행할 때 해킹되는 것으로 표시되는 경우가 있음) 컨테이너/가상 머신처럼 작동하지 않는 보다 체계적인 방식으로 환경과 지속적으로 연관될 수 있다고 생각합니다. 헤비급 솔루션입니다. 이 문제에 대한 표준적인 해결책이 있습니까?

답변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);
}

관련 정보