프로그램을 실행할 때 환경 변수를 설정하고 설정 해제하는 방법은 무엇입니까?

프로그램을 실행할 때 환경 변수를 설정하고 설정 해제하는 방법은 무엇입니까?

program환경 변수를 설정하여 일부 구성에 의존하는 프로그램이 있다고 가정해 보겠습니다 . 이제 나는 또한 10개의 다른 환경 변수로 내 로컬 환경을 오염시키고 싶지 않으므로 이 경우 스크립트가 유용할 것이라고 생각했습니다.

set VAR1=...
set VAR2=...
.
.
# run the program
./program

unset VAR1
unset VAR2
.
.

./program따라서 실행하는 대신 지금 이 스크립트를 실행하겠습니다. 내 질문은 이것이 일을 하는 관용적인 방법인가 하는 것입니다. 제가 알아야 할 더 좋은 방법이 있나요?

답변1

Bourne과 rc유사한 셸에서 환경 변수를 한 번의 명령 호출에만 전달하려면 다음을 수행할 수 있습니다.

VAR1=value VAR2=other-value some-command with its args

그러나 일부 셸에서 if는 some-command특수 내장 함수(예 export: , set, eval)이거나 변수가 설정된 상태로 유지되는 함수입니다(항상 내보내지는 않음).

csh 또는 tcsh 셸에 해당하는 것은 없지만 이러한 셸(또는 관련 셸)에서는 항상 다음 env명령을 사용할 수 있습니다.

env VAR1=value VAR2=other-value some-command with its args

env이름이 유효한 쉘 변수 이름이 아닌 환경 변수를 전달하려는 경우(이러한 변수는 권장되지 않음) Bourne과 같은 쉘에서도 이를 사용해야 합니다. 예를 들면 다음과 같습니다.

env C++=/usr/bin/g++ some-command with its args

csh에서는 set var=value필요한 환경 변수가 아닌 쉘 변수가 설정됩니다 setenv var value.

셸 에서는 다음을 사용하여 변수를 환경으로 내보내면서 변수의 범위를 제한 fish할 수 있습니다 .set -lxbegin...end

begin
  set -lx VAR1 value
  set -lx VAR2 other-value
  some-command with its args
end

zsh익명 함수를 사용하여 동일한 작업을 수행할 수 있습니다.

(){
  local -x VAR1=value VAR2=other-value
  some-command with its args
  some-other-command with other args
}

또는:

function {
  local -x VAR1=value VAR2=other-value
  some-command with its args
  some-other-command with other args
}

VAR1=value VAR2=other-value some-command with its args그러나 해당 환경에서 여러 명령을 실행하려는 경우에만 표준 구문을 사용하는 것이 좋습니다.

Bourne과 같은 쉘에서는 서브쉘을 사용하여 변수 할당 범위를 제한할 수도 있습니다.

(
  VAR1=value VAR2=other-value
  export VAR1 VAR2
  some-command with its args
  some-other-command with other args
)

POSIX 셸(Bourne 셸은 아니지만 Bourne 셸은 과거의 일임) 은 인수의 특수 내장 함수에 export값을 할당 할 수도 있습니다.

(
  export VAR1=value VAR2=other-value
  some-command with its args
  some-other-command with other args
)

이 방법은 다음 용도로도 사용할 수 있습니다 (t)csh.

(
  setenv VAR1 value
  setenv VAR2 other-value
  some-command with its args
  some-other-command with other args
)

이름이 유효한 쉘 변수 이름 이 아닌 변수를 사용하는 환경에서 여러 명령을 실행하려면 항상 envstart 를 사용 zsh하거나 환경에서 이러한 변수를 제거하지 않는 다른 쉘을 사용할 수 있습니다.bashcsh

# most shell syntax:
env C++=/usr/bin/g++ zsh -c '
  some-command with its args
  some-other-command with other args
'
# (t)csh syntax
env C++=/usr/bin/g++ csh -c '\
  some-command with its args\
  some-other-command with other args\
'

또한 ((t)csh 및 대부분의 Bourne 유사 쉘 에서 사용 되는) unset변수 설정은 이전 변수 값을 복원 하는 것과 동일하지 않습니다. 위의 모든 예제 코드 후에는 처음에 설정되지 않은 변수만 결국 설정 해제됩니다.unset varunset -v varbashvar = ()rcset -e varfish

답변2

프로그램 실행이 스크립트에서 마지막으로 수행하는 작업인 경우, 즉 스크립트의 나머지 부분에서 환경을 "오염"시키는 것에 대해 걱정할 필요가 없으며 변수를 설정 해제할 필요가 없습니다. 환경 변수 내보내기는 현재 프로세스와 해당 하위 프로세스에만 영향을 미치며, 상위 프로세스의 환경은 변경할 수 없습니다. 스크립트가 종료되면 변수가 사라집니다.

export그런데 환경에 대한 내보내기 변수를 사용해야 하며 set셸에서 로컬로만 설정해야 합니다.

관련 정보