Bash에서 잘못된 환경 변수를 설정 해제하는 방법은 무엇입니까?

Bash에서 잘못된 환경 변수를 설정 해제하는 방법은 무엇입니까?

기존 docker-entrypoint 스크립트에 기능을 추가하려고 하는데 이미지 작성자가 환경 변수의 형식을 key.subkey=value로 결정했습니다. 나는 내 변수를 설정하고 구문 분석하기 전까지 이것이 잘못된 명명 체계라는 것을 몰랐습니다. 이름 지정 체계가 유효하지 않으므로 다음과 같이 읽습니다.

while IFS='=' read -r var key
do
# parse
done < <(env)

내가 원하는 것은 사용 후 내 자신의 "잘못된" 환경 변수를 설정 해제하는 수정된 진입점을 설치하는 것입니다. 그렇지 않으면 내 변수가 정규식 패턴에 의해 포착되어 스크립트가 종료됩니다. 캡처된 변수를 바이너리에 옵션으로 전달하기 때문입니다.

어쨌든 Docker의 환경 변수 기능을 사용하여 강제로 설정한 잘못된 변수를 실행 취소할 수 있습니까? 왜냐하면 내가 이것을 하려고 할 때:

unset -v foo.foo-bar.setting-to-update

나는 얻다:

bash: unset: `foo.foo-bar.setting-to-update': not a valid identifier

감사해요

답변1

도커 및 기타 혼란 없이 이해하기가 더 쉬울 수 있습니다. 서브루틴에 전달된 환경에서 제거하려는 이름이 "odd"인 환경 변수가 있지만 사용할 수 없습니다.unset

예를 들어

% env odd.variable=100 bash
bash-4.2$ env | grep odd
odd.variable=100
bash-4.2$ unset odd.variable
bash: unset: `odd.variable': not a valid identifier

env매개변수가 포함된 명령이 -u도움이 될 수 있습니다.

bash-4.2$ env | grep odd
odd.variable=100
bash-4.2$ env -u odd.variable bash
bash-4.2$ env | grep odd
bash-4.2$ 

bash이 새로운 쉘에는 이상한 변수 세트가 없음 을 알 수 있습니다 .

여러 -u 옵션을 사용하여 여러 변수를 설정 해제할 수 있습니다.

따라서 변수가 여러 개인 경우:

bash-4.2$ env | grep odd
odd.var2=200
odd.var3=300
odd.var1=100

그럼 모두 삭제해도 돼요

bash-4.2$ env -u odd.var1 -u odd.var2 -u odd.var3 bash
bash-4.2$ env | grep odd
bash-4.2$ 

모든 변수 이름을 알고 있으면 쉽습니다.

이름은 모르지만 패턴을 인식할 수 있는 경우(예: 모든 변수가 "홀수"로 시작함) 명령을 작성할 수 있습니다.

예를 들어

to_remove=$(env | sed -n 's/^\(odd\.[^=]*\)=.*/-u \1/p')

sed명령은 필요한 -u설정을 생성합니다

예를 들어

bash-4.2$ env | grep odd
odd.var2=200
odd.var3=300
odd.var1=100
bash-4.2$ to_remove=$(env | sed -n 's/^\(odd\.[^=]*\)=.*/-u \1/p')
bash-4.2$ echo $to_remove
-u odd.var2 -u odd.var3 -u odd.var1
bash-4.2$ env $to_remove bash
bash-4.2$ env | grep odd
bash-4.2$ 

경고: 변수 이름이나 내용에 이상한 문자(예: 내장된 CR/LF 시퀀스)가 있으면 문제가 발생할 수 있습니다. 하지만 일반적인 상황에서는 괜찮을 것입니다!

이는 모든 프로그램에 적용됩니다.

env -u odd.variable myscript

관련 정보