특정 값을 사용하여 실행할 수 있습니다 ENV_VAR=value command
. unset과 동등한 것은 무엇입니까?command
ENV_VAR
ENV_VAR
command
답변1
-i
POSIX는 전체 환경을 지우는 옵션 외에 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
그러나 이는 이름이 쉘 변수에 매핑될 수 없는 환경 변수(일부 쉘은 어쨌든 시작 시 환경에서 이러한 변수를 제거한다는 점에 유의) 또는 읽기 전용으로 표시된 변수 에는 적용되지 않습니다 .
-v
Bourne 쉘에 사용되며, 사용할 수 없는 bash
경우 설정 해제할 수 있습니다.unset
-v
ENV_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
하지 마십시오. 작동하지 않고 취소되기 때문입니다 .mksh
yash
typeset
local
unset
local
또한 에서는 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: