환경 변수

환경 변수 (Environment Variables)

운영 체제의 환경 변수를 바이트 문자열 매핑으로 다루는 방법을 알아봐요. 환경 변수 집합(environment variable set)을 생성하고 읽고 바꾸는 여러 프로시저와 관련 매개변수를 다룹니다.

출처: Racket Reference

본문

15.7 환경 변수

환경 변수 집합(environment variable set)은 바이트 문자열에서 바이트 문자열로의 부분 매핑을 캡슐화합니다. Racket 프로세스의 초기 환경 변수 집합은 운영 체제의 환경 변수와 연결돼 있어요. 집합에 대한 접근이나 변경은 Racket 프로세스의 운영 체제 환경 변수를 읽거나 바꿉니다.

Windows 환경 변수는 대소문자를 구분하지 않으므로, Windows에서 환경 변수 집합의 키 바이트 문자열은 대소문자가 접혀집니다(folded). 정확히는, 키 바이트 문자열은 string-locale-downcase로 소문자로 변환된 문자들의 UTF-8 인코딩으로 강제 변환돼요.

현재 환경 변수 집합은 current-environment-variables 매개변수로 결정되며, subprocess가 생성될 때 그 subprocess로 전파됩니다.

(environment-variables? v) → boolean?
v : any/c

v가 환경 변수 집합이면 #t를, 그렇지 않으면 #f를 반환합니다.

(current-environment-variables) → environment-variables?
(current-environment-variables env) → void?
env : environment-variables?

subprocess로 전파되고 getenvputenv의 기본 집합으로 사용되는 환경 변수 집합을 결정하는 parameter예요.

(bytes-environment-variable-name? v) → boolean?
v : any/c

v가 바이트 문자열이고 환경 변수 이름에 유효하다면 #t를 반환합니다. 환경 변수 이름은 값이 0 또는 61인 바이트를 포함할 수 없는데, 61은 (char->integer #\=)이에요. Windows에서는 환경 변수 이름의 길이가 0이 아니어야 합니다.

(make-environment-variables name val ...) → environment-variables?
name : bytes-environment-variable-name?
val  : bytes-no-nuls?

주어진 name에서 val로의 매핑으로 초기화된 새 환경 변수 집합을 만듭니다.

(environment-variables-ref env name)
  → (or/c #f (and/c bytes-no-nuls? immutable?))
env  : environment-variables?
name : bytes-environment-variable-name?

env에서 name에 대한 매핑을 반환하고, name에 매핑이 없으면 #f를 반환합니다.

보통 name은 현재 locale의 기본 인코딩을 사용한 문자열의 바이트 문자열 인코딩이어야 해요. Windows에서는 name이 UTF-8 인코딩으로 강제 변환되고 대소문자가 정규화됩니다.

(environment-variables-set! env name maybe-bstr [fail]) → any
env        : environment-variables?
name       : bytes-environment-variable-name?
maybe-bstr : (or/c bytes-no-nuls? #f)
fail       : (-> any) = (lambda () (raise (make-exn:fail ....)))

env에서 name에 대한 매핑을 maybe-bstr로 바꿉니다. maybe-bstr#f이고 env가 Racket 프로세스의 초기 환경 변수 집합이면, name에 대한 운영 체제 환경 변수 매핑이 제거돼요.

보통 namemaybe-bstr는 현재 locale의 기본 인코딩을 사용한 문자열의 바이트 문자열 인코딩이어야 해요. Windows에서는 name이 UTF-8 인코딩으로 강제 변환되고 대소문자가 정규화되며, env가 Racket 프로세스의 초기 환경 변수 집합이면 maybe-bstr도 UTF-8 인코딩으로 강제 변환됩니다.

성공하면 environment-variables-set!의 결과는 #<void>예요. env가 Racket 프로세스의 초기 환경 변수 집합이라면, 운영 체제 환경 변수 매핑을 조정하려는 시도가 어떤 이유로든 실패할 수 있는데, 그 경우 failenvironment-variables-set!에 대해 꼬리 위치에서 호출됩니다. 기본 fail은 예외를 일으켜요.

(environment-variables-names env)
  → (listof (and/c bytes-environment-variable-name? immutable?))
env : environment-variables?

env가 매핑하는 이름에 해당하는 바이트 문자열의 목록을 반환합니다.

(environment-variables-copy env) → environment-variables?
env : environment-variables?

env와 같은 매핑으로 초기화된 환경 변수 집합을 반환합니다.

(getenv name) → (or/c string-no-nuls? #f)
name : string-environment-variable-name?
(putenv name value) → boolean?
name  : string-environment-variable-name?
value : string-no-nuls?

environment-variables-refenvironment-variables-set!의 편의 래퍼로, 현재 locale의 기본 인코딩을 사용해 문자열과 바이트 문자열 사이를 변환하고(인코딩 오류에는 대체 문자로 #\? 사용), 항상 current-environment-variables의 현재 환경 변수 집합을 사용해요. putenv 함수는 성공 시 #t를, 실패 시 #f를 반환합니다.

(string-environment-variable-name? v) → boolean?
v : any/c

v가 문자열이고, 현재 locale의 인코딩을 사용한 그 인코딩이 bytes-environment-variable-name?에 따라 환경 변수 이름에 유효하다면 #t를 반환합니다.

더 알아보기