Bash 의 환경 변수

3573 단어
Bash 에서 통과 할 수 있 습 니 다. export 명령 은 현재 Shell 프로 세 스 의 환경 변 수 를 봅 니 다. 이러한 환경 변 수 는 Bash 가 직접 만 든 것 이 고, 또 일 부 는 Bash 가 부모 프로 세 스에 서 물 려 받 은 것 입 니 다. 그러나 주의해 야 할 것 은 부모 프로 세 스 가 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 가 시작 할 때 버 려 지기 때문에 하위 프로 세 스 에 전달 할 수 없습니다.

좋은 웹페이지 즐겨찾기