하나의 명령에 대해 환경 변수를 설정 해제


24

에 대한 특정 값으로 실행 ENV_VAR=value command하도록 실행할 수 있습니다 . unset 에 해당하는 것은 무엇입니까 ?commandENV_VARENV_VARcommand


7
command따로 : 불행히도 자리 표시 자의 선택입니다. 실제로 해당 이름으로 기본 제공 명령 있기 때문 입니다. mycommand또는 somecommand더 나은 습관이 될 수 있습니다.
Charles Duffy

@CharlesDuffy, 나는 보통 그것을 위해 사용 cmd합니다.
Stéphane Chazelas

답변:


35

보다 다른 -i전체 환경을 쳐 옵션, POSIX는 env변수를 설정 해제 할 수있는 방법을 제공하지 않습니다.

그러나 몇 가지 env구현 ( busybox최소한 GNU 및 FreeBSD 포함 )을 사용하면 다음을 수행 할 수 있습니다.

env -u ENV_VAR command

어떤의 모든 인스턴스 제거에서 일하는 것 ENV_VAR, 하늘의 이름 (와 환경 변수에없는 작업을 수행하는 것이 (비록 환경에서 메모를 변수 env -u ''중 하나에 오류가 제공 또는 전부가 동의하더라도 구현에 따라 효과가 env '=value'아마 제한을 unsetenv()POSIX가 빈 문자열에 대한 오류를 반환 해야하는 C 함수 에 의해 발생 하지만 putenv()))에 대한 제한은 없습니다 .

이식 가능하게 (POSIX 쉘에서) 다음을 수행 할 수 있습니다.

(unset -v ENV_VAR; exec command)

(일부 쉘의 경우 다음을 사용하여 실행할 exec수 있습니다 command: 위와 같이 함수 또는 내장 기능 대신 파일 시스템에서 파일을 실행합니다 ( alias확장 을 우회합니다 env). .

그러나 셸 변수에 매핑 할 수없는 이름을 가진 환경 변수 ( mksh시작할 때 환경에서 해당 변수를 제거하는 것과 같은 일부 셸 ) 또는 읽기 전용으로 표시된 변수에는 작동하지 않습니다.

-vBourne 쉘을위한 것이며 bashunset없이 -v수 설정 해제 ENV_VAR 기능을 전혀 없었다 경우 변수 해당 이름이. -f옵션 을 전달하지 않으면 대부분의 다른 쉘은 기능을 설정 해제하지 않습니다 . (실제로 차이를 만들지 않을 것임).

(또한 어떤 상황에서는 변수를 설정 해제하지는 않지만 외부 범위에서 변수를 표시 할 수 있는 bash/ mksh/ 의 버그 / 기능에주의하십시오 )yashunset

경우 perl로 볼 수 있습니다, 당신은 할 수 있습니다 :

perl -e 'delete $ENV{shift@ARGV}; exec @ARGV or die$!' ENV_VAR command

빈 이름을 가진 환경 변수에서도 작동합니다.

다음과 같이 내장 또는 함수에 대한 환경 변수를 변경하고 하위 쉘에서 실행하지 않으려는 경우 모든 기능이 작동하지 않습니다 bash.

env -u LANG printf -v var %.3f 1.2 # would run /usr/bin/printf instead
(unset -v LANG; printf -v var %.3f 1.2) # changes to $var lost afterwards

(여기서 LANG를 잘못된 접근 방식 .으로 설정하는 것은 소수점 구분 기호로 사용 및 이해됩니다. 사용 LC_ALL=C printf...하는 것이 좋습니다 )

일부 셸에서는 대신 함수를 사용하여 변수의 로컬 범위를 만들 수 있습니다.

without() {
  local "$1" # $1 variable declared as initially unset in bash¹
  shift
  "$@"
}
without LANG printf -v var %.3f 1.2

와 함께 zsh, 당신은 또한 익명의 기능을 사용할 수 있습니다 :

(){local ENV_VAR; command}

이 방법은 local변수를 초기 설정되지 않은 것으로 선언하지 않지만 값과 속성을 상속하는 일부 쉘 (Almquist 쉘 기반 쉘과 같은)에서는 작동하지 않습니다. 그, 당신은 할 수 local ENV_VAR; unset ENV_VAR있지만,에 그렇게하지 않는 mkshyash( typeset대신 local문제가 해결되지 하듯이 하나), (가) unset에만 취소 될 것이다 local.

¹ 또한 bash로컬에서 ENV_VAR(설정되지 않은 경우에도) 내보내기 속성 이 유지 됩니다. 따라서 command에 값을 할당하는 함수 인 경우 ENV_VAR나중에 호출되는 명령 환경에서 변수를 사용할 수 있습니다. unset ENV_VAR그 속성을 지울 것입니다. 또는 local +x ENV_VAR깨끗한 슬레이트를 보장하는 변수를 사용할 수 있습니다 (변수가 읽기 전용으로 선언되지 않은 경우에는에서 할 수있는 일이 없습니다 bash).


1
별도의 질문이지만 도대체 이름이 비어있는 환경 변수는 무엇이며 어떤 종류의 악용에도 어떻게 사용합니까? 환경을 읽고 구체적으로 이와 같은 것을 찾는 프로그램을 작성하지 않아도 되겠습니까?
Joe

@Joe, 예를 들어보십시오 env '=foo' python -c 'import os; print os.environ[""]'. 많은 사람들이 그런 변수를 설정하기를 기대하지 않습니다.
Stéphane Chazelas

9

내가 아는 한 직접적으로 동등한 것은 없습니다. 서브 쉘을 사용할 수 있습니다 :

(unset ENV_VAR; exec command)

(unset ENV_VAR; exec somecommand)(서브 쉘을 소비함으로써) 효율적으로 원본과 동등한 것을 원한다면. 그대로, 이것은 여분의 포크를 추가합니다.
Charles Duffy

1
실제로 @Charles command는 서브 쉘 호출의 마지막 명령 이므로 일부 쉘은 자동으로 수행합니다 .
Stephen Kitt

이 방법은 대화식으로 입력하기가 간단하므로 +1입니다. 나는 셸을 기억하지 않고 셸 환경의 셸 환경을 일회성 변경하기 위해 서브 셸을 사용합니다 env -u.
Peter Cordes

0

당신이 사용할 수있는 ENV_VAR= command

실제로 변수를 설정 해제하지는 않지만 많은 경우에 유용 할 수 있습니다 (쉘 스크립트는 일반적으로 test -n변수가 설정되어 있는지 확인하는 데만 사용 합니다).

$ export ENV_VAR=foo
$ mycommand
ENV_VAR: foo
$ ENV_VAR=bar mycommand
ENV_VAR: bar
$ ENV_VAR= mycommand
ENV_VAR: 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.