스크립트에서 환경 변수를 설정 해제하는 가장 방어적이고 강력하며 이식 가능하고 편집증적인 방법은 무엇입니까?
env -i some-command
나는 외부 도구를 사용하여 에서와 같은 환경 변수를 지우 거나 perl -e 'delete $ENV{SOME_VARIABLE}; exec("some-command")'
피할 수 있다면 피하려고 노력하고 있습니다 .
현재로서는 사용하고 있습니다.
export SOME_VARIABLE; unset -v SOME_VARIABLE
SOME_VARIABLE
같은 이름의 쉘 변수나 쉘 함수가 존재하더라도 삭제될 것이라고 생각합니다 . (쉘 변수가 존재하는 경우 파괴되지만).
답변1
unset SOME_VARIABLE
SOME_VARIABLE
환경에서 제거되었습니다. 이것이 거의 모든 상황에서 필요한 전부입니다. 드문 경우지만 이것이 충분하지 않은 경우 중간 프로세스 호출을 피할 수 없습니다(그러나 의 또 다른 인스턴스일 수도 있음 sh
).
export
나중에 전화해도 unset -v
불이익은 없습니다 . 나중에 설정을 해제하려는 경우 변수를 내보낼 필요가 없습니다. 함수는 환경에 저장되지 않으므로 unset -v
하위 프로세스가 보는 내용에 영향을 미치지 않습니다.
일부 쉘은 환경을 통해 함수를 내보내지만 함수 정의를 변수 정의로 인코딩하여 수행합니다. 변수 이름이 함수 이름과 같으면 unset FUNCTION_NAME
처리되고, 그렇지 않으면 unset -v FUNCTION_NAME
아무 작업도 수행되지 않습니다 unset FUNCTION_NAME
.
변수를 설정 해제할 수 없는 극단적인 경우는 변수가 읽기 전용으로 선언된 경우입니다. 변수를 읽기 전용 상태에서 일반 상태로 복원하는 이식 가능한 방법은 없습니다. 환경에서 읽기 전용 변수를 이식 가능하게 제거하려면 셸의 다른 복사본을 호출해야 합니다.
readonly foo=bar
export foo
sh -c 'unset foo; exec some-command'
또 다른 극단적인 경우는 일부 쉘이 일부 변수를 정의하는 데 지속되고 자동으로 설정 해제되는 것을 방지한다는 것입니다. 환경에서 제거하려면 다른 셸이나 유사한 env
디딤돌 유틸리티를 사용해야 합니다.