환경을 많이 조작하는 프로그램이 있습니다. PYTHONPATH 및 LD_LIBRARY_PATH와 같은 항목을 설정합니다.
이 프로그램은 다른 프로그램을 실행해야 하지만 모든 환경 작업 없이 새로운 환경에서 rc 파일의 기본 환경을 사용해야 합니다.
csh -c를 사용하면 이 작업을 수행할 수 있을 것 같지만 그렇게 하면 현재 환경이 보존됩니다. 이를 수행할 수 있는 좋은 방법이 있습니까?
내가 이것을 위해 어떤 쉘을 사용하는지는 중요하지 않습니다. 또한 원본 .rc 파일이 필요하므로 env -i가 제대로 작동하지 않습니다. (env와 bash -cl을 함께 사용하면 뭔가를 해킹할 수 있을 것 같지만 더 좋은 방법이 있을 것입니다)
답변1
새로운 프로세스를 포크하면 환경이 보호됩니다.
특정 환경에서 프로세스를 실행해야 하는 경우 해당 프로세스에서 시작된 모든 프로세스도 해당 환경을 사용합니다.
그러나 오염되지 않은 환경을 파일로 저장할 수 있습니다: export >original_env
.
나중에 이 파일을 사용하여 오염된 환경을 정리 env -i
하고 이전 환경을 가져올 수 있습니다.
답변2
이것이 최적인지는 확실하지 않지만 소규모 테스트에서 다음과 같은 결과를 얻었습니다.
env -i /bin/bash -cl 'COMMAND'
분명히 -l은 다른 인수와 공존하지 않기 때문에 -cl을 사용하여 csh를 실행할 수 없지만 bash에서는 가능합니다.
예상 도착 시간:
제가 실제로 사용하는 것은 다음과 같습니다.
#!/bin/csh -f
set evs = ""
if ($1 == '--envVars') then
set envs = "$2"
shift
shift
endif
env -i $envs CMD="$*" /bin/bash -c '$CMD'
필요한 경우 명령줄에서 $PATH 및 $PYTHONPATH와 같은 ENV 변수를 입력할 수 있습니다.
답변3
제가 생각할 수 있는 가장 쉬운 방법은 export
변수를 사용하지 않는 것입니다. 사용 사례에 따라 이것이 가능할 수도 있고 불가능할 수도 있습니다. 예를 들어:
$ cat a.sh
#!/bin/bash
BAR=foo
export BAZ=foo
bash -c 'echo "bash -c : BAR: $BAR, BAZ: $BAZ"'
echo "normal : BAR: $BAR, BAZ: $BAZ"
$ ./a.sh
bash -c : BAR: , BAZ: foo
normal : BAR: foo, BAZ: foo
위의 예에서 볼 수 있듯이 로 시작된 셸은 bash -c
내보낸 변수에만 액세스할 수 있습니다.
답변4
내가 찾은 유일한 방법은 sudo를 사용하는 것입니다(허용되는 경우).
sudo -u "$USER" path_to_script
예시 스크립트:
#!/bin/sh
set | grep ARGH
용법:
$ export ARGH=yes
$ sudo -u "$USER" ./check_env
(empty line, so ARGH is not set)