새 쉘에서 프로그램을 실행하는 방법은 무엇입니까?

새 쉘에서 프로그램을 실행하는 방법은 무엇입니까?

환경을 많이 조작하는 프로그램이 있습니다. 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)

관련 정보