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 -lx
begin...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
)
이름이 유효한 쉘 변수 이름 이 아닌 변수를 사용하는 환경에서 여러 명령을 실행하려면 항상 env
start 를 사용 zsh
하거나 환경에서 이러한 변수를 제거하지 않는 다른 쉘을 사용할 수 있습니다.bash
csh
# 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 var
unset -v var
bash
var = ()
rc
set -e var
fish
답변2
프로그램 실행이 스크립트에서 마지막으로 수행하는 작업인 경우, 즉 스크립트의 나머지 부분에서 환경을 "오염"시키는 것에 대해 걱정할 필요가 없으며 변수를 설정 해제할 필요가 없습니다. 환경 변수 내보내기는 현재 프로세스와 해당 하위 프로세스에만 영향을 미치며, 상위 프로세스의 환경은 변경할 수 없습니다. 스크립트가 종료되면 변수가 사라집니다.
export
그런데 환경에 대한 내보내기 변수를 사용해야 하며 set
셸에서 로컬로만 설정해야 합니다.