Bash 의 환경 변수
C 언어 차원 에서 환경 변 수 는 이름 으로 저 장 됩 니 다. environ 의 전역 변수 에서 이 변수의 값 은 문자열 의 배열 입 니 다. 이렇게:
{"foo=1", "bar=2"}
부자 손 세대 의 과정 에서 전달 되 는 것 은 바로 이런 배열 이다. 우리 가 말 하 는 환경 변수의 원래 모습 은 우리 가 흔히 고급 언어 에서 보 는 키 값 이 아니 라 문자열 이다.그러나 운영 체 제 는 환경 변수 문자열 의 형식 에 대해 어떠한 제한 도 하지 않 았 습 니 다. environ 변수의 값 은 이 럴 수 있 습 니 다.
{"1=1", "=2", "="}
심지어 이렇게:
{"foo
bar=1"}
Bash 가 시 작 될 때 검사 합 니 다. environ 배열 의 모든 문자열 이 포함 되 어 있 으 면 =, 그리고 = 왼쪽 에 임의의 문자 가 있 으 면 = 에서 나 누 어 변수 이름 을 만 들 고, 하 나 는 값 을 만 들 며, 자신의 변수 가 됩 니 다.어?'1 = 1' 도 변수 로 가 져 옵 니까?예, Bash 의 실현 에서 이 렇 습 니 다. 다만 이러한 변 수 는 특수 한 속성 표 시 를 추가 합 니 다.
변수 이름 이 합 법 적 인 변수 가 추 가 된 속성 은:
att_exported | att_imported
하위 프로 세 스에 내 보 낼 환경 변 수 를 표시 합 니 다. 환경 변수 에서 가 져 온 변 수 를 표시 합 니 다.
변수 이름 이 합 법 적 이지 않 은 변수 가 추 가 된 속성 은:
att_exported | att_imported | att_invisible
보이 지 않 음 을 나타 내 는 invisible 속성 이 하나 더 생 겼 습 니 다.
Bash 가 시 작 된 후에 각 내부 명령 은 이 표 시 를 통 해 자신 이 원 하 는 변수 인지 아 닌 지 를 판단 할 수 있 습 니 다.예 를 들 어 set 명령 은 1 이라는 변 수 를 출력 하지 않 습 니 다.
$ env -i 1=1 bash -c set | grep '1='
그러나 export 명령 은:
$ env -i 1=1 bash -c export declare -x 1 declare -x OLDPWDdeclare -x PWD="/Users/admin"declare -x SHLVL="1"
declare - x 1 은 분명히 불법 이 고 심지어 이렇게 할 수 있다.
$ env -i $'foorm -rf/=' bash -c export declare -x OLDPWDdeclare -x PWD="/Users/admin"declare -x SHLVL="1"declare -x foorm -rf/
매우 위험 해 보이 지만 현재 Bash 4.4 베타 버 전 은 이 문 제 를 복 구 했 습 니 다. export 명령 은 더 이상 변수 이름 이 합 법 적 이지 않 은 변 수 를 출력 하지 않 습 니 다. 다음은 export 명령 소스 코드 의 변경 입 니 다.
+ /* If we imported a variable that's not a valid identifier, don't
+ show it in any lists. */
+ if ((var->attributes & (att_invisible|att_imported)) == (att_invisible|att_imported))
+ continue;
그럼 Bash 는 다른 프로그램 을 시작 할 때 이러한 환경 변 수 를 하위 프로 세 스에 전달 합 니까?답 은 그 럴 것 입 니 다. 우 리 는 두 개의 env 명령 사이 에 bash 명령 을 삽입 하여 효 과 를 볼 수 있 습 니 다.
$ env -i 1=1 bash -c env PWD=/Users/adminSHLVL=11=1_=/usr/bin/env
Bash 는 다른 프로그램 을 시작 할 때 자신의 모든 변 수 를 attexported 속성 과 값 은 빈 변수 가 아 닙 니 다. 그리고 값 은 각각 = 연결 하여 문자열 배열 을 만 들 고 environ 변 수 를 다시 복원 합 니 다. 즉, 시작 할 때 환경 변 수 를 가 져 오 는 것 과 반대 되 는 작업 을 한 것 입 니 다.
등호 나 등호 왼쪽 에 문자 가 없 는 환경 변 수 는 Bash 가 시작 할 때 버 려 지기 때문에 하위 프로 세 스 에 전달 할 수 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.