
때로는 런타임에 종속성을 찾기 위해 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(대시 선호) 래퍼를 만듭니다.
#!/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);
}