명령에 대한 환경 변수 설정 해제

명령에 대한 환경 변수 설정 해제

특정 값을 사용하여 실행할 수 있습니다 ENV_VAR=value command. unset과 동등한 것은 무엇입니까?commandENV_VARENV_VARcommand

답변1

-iPOSIX는 전체 환경을 지우는 옵션 외에 env변수를 설정 해제하는 방법을 제공하지 않습니다 .

그러나 일부 env구현(적어도 GNU busybox및 FreeBSD 포함)에서는 다음을 수행할 수 있습니다.

env -u ENV_VAR command

ENV_VAR이렇게 하면 환경에서 변수의 모든 인스턴스를 제거하는 데 도움이 됩니다 . 이름이 비어 있는 환경 변수에서는 작동하지 않습니다( env -u ''모든 것이 허용되더라도 구현에 따라 오류가 발생하거나 아무런 효과가 없으며 env '=value'제한이 될 수 있음). C 함수로 인해 unsetenv()POSIX에서는 빈 문자열 오류가 반환되어야 하지만 ))에는 그러한 제한이 없습니다 putenv().

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

(unset -v ENV_VAR; exec command)

(일부 셸의 경우 명령을 사용하면 실행이 exec변경될 수 있습니다 command. 위에 표시된 대로 함수나 내장 대신 파일 시스템에서 명령을 실행합니다( alias분명히 확장을 우회합니다) env. 이러한 경우에는 무시해야 합니다.

mksh그러나 이는 이름이 쉘 변수에 매핑될 수 없는 환경 변수(일부 쉘은 어쨌든 시작 시 환경에서 이러한 변수를 제거한다는 점에 유의) 또는 읽기 전용으로 표시된 변수 에는 적용되지 않습니다 .

-vBourne 쉘에 사용되며, 사용할 수 없는 bash경우 설정 해제할 수 있습니다.unset-vENV_VAR 기능만약 없다면바꾸다이 이름으로. 대부분의 다른 쉘은 이 옵션을 전달하지 않으면 기능 설정을 해제하지 않습니다 -f. (실제로는 영향을 미칠 가능성이 낮습니다.)

bash(또한 //의 mksh버그/ yash잘못된 기능 으로 인해 unset변수가 설정 해제되지 않을 수도 있지만,외부 범위에 변수 표시)

그렇다면 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

Pass 를 사용하면 zsh익명 함수를 사용할 수도 있습니다.

(){local ENV_VAR; command}

local이 방법은 변수를 초기에 설정 해제된 것으로 선언하지 않는(그러나 값과 속성을 상속하는) 일부 쉘(예: Almquist 쉘 기반 쉘)에서는 작동하지 않습니다 . 이 경우에는 할 수 있지만 또는 ( 대신 )에서는 수행 local ENV_VAR; unset ENV_VAR하지 마십시오. 작동하지 않고 취소되기 때문입니다 .mkshyashtypesetlocalunsetlocal

또한 에서는 bash로컬 ENV_VAR(설정되지 않은 경우에도)이 그대로 유지됩니다.출구속성. 따라서 command함수에 값이 할당 되면 ENV_VAR이후에 호출되는 명령 환경에서 변수를 사용할 수 있습니다. unset ENV_VAR이 속성은 지워집니다. 또는 깨끗한 상태를 보장하는 이를 사용할 수도 있습니다 local +x ENV_VAR(변수가 읽기 전용으로 선언되지 않은 경우에는 이에 대해 할 수 있는 일이 많지 않습니다 bash).

답변2

내가 아는 한, 서브쉘을 사용할 수 있는 직접적인 방법은 없습니다.

(unset ENV_VAR; exec command)

답변3

당신은 그것을 사용할 수 있습니다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: 

관련 정보