NAME

environ - 사용자 환경

SYNOPSIS

extern char **environ;

DESCRIPTION

변수 environ은 문자열 포인터들의 배열을 가리키는데 이를 "환경"이라고 한다. 그 배열의 마지막 포인터는 NULL 값이다. 새 프로그램을 시작할 때 exec(3) 호출에서 프로세스가 이용 가능하도록 이 문자열 배열을 준비해 준다. fork(2)를 통해 자식 프로세스가 만들어질 때 부모 환경의 사본을 물려받는다.

관행상 environ의 문자열들은 "name=value" 형태다. 이름은 대소문자를 구별하며 "=" 문자가 들어갈 수 없다. 값은 문자열로 표현 가능한 무엇이든 가능하다. 이름과 값 안에 널 바이트('\0')가 들어갈 수 없다. 문자열을 종료하는 것으로 보기 때문이다.

sh(1)에서는 export 명령으로, csh(1)을 쓴다면 setenv 명령으로 셸의 환경에 환경 변수들을 넣을 수 있다.

다양한 방식으로 셸의 최초 환경이 채워진다. 예를 들어 (pam(8)을 쓰는 시스템에서는) 모든 사용자의 로그인 시점에 pam_env(8)에서 /etc/environment의 정의들을 처리해서 채운다. 그리고 시스템 전역 /etc/profile 스크립트나 사용자별 초기화 스크립트 같은 여러 셸 초기화 스크립트에 셸의 환경에 변수를 추가하는 명령이 있을 수 있다. 자세한 내용은 사용하는 셸의 매뉴얼 페이지를 보라.

본(Bourne) 스타일 셸에서 다음 문법을 지원한다.

NAME=value command

이를 이용해 command를 실행하는 프로세스 범위로 한정되는 환경 변수 정의를 만들 수 있다. command 앞에 공백으로 구분한 여러 개의 정의가 올 수도 있다.

exec(3) 시점에 인자들이 환경에 들어갈 수도 있다. C 프로그램에서 getenv(3), putenv(3), setenv(3), unsetenv(3) 함수를 사용해 자기 환경을 조작할 수 있다.

다음은 시스템에서 일반적으로 볼 수 있는 환경 변수들이다. 이 목록은 완전하지 않으며 평균적인 사용자가 일상적으로 볼 수 있는 변수들만 포함돼 있다. 특정 프로그램이나 라이브러리 함수 전용인 환경 변수들은 적절한 매뉴얼 페이지의 ENVIRONMENT 절에 설명돼 있다.

USER
로그인한 사용자의 이름. (일부 BSD 유래 프로그램들에서 사용.) 로그인 시점에 설정됨. 아래 NOTES 참고.
LOGNAME
로그인한 사용자의 이름. (일부 시스템 V 유래 프로그램들에서 사용.) 로그인 시점에 설정됨. 아래 NOTES 참고.
HOME
사용자의 로그인 디렉터리. 로그인 시점에 설정됨. 아래 NOTES 참고.
LANG
로캘 카테고리들에 사용할 로캘 이름. LC_ALL이나 더 상세한 환경 변수 LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME 등이 있으면 그게 우선함. (LC_* 환경 변수들에 대한 자세한 내용은 locale(7) 참고.)
PATH

sh(1) 및 기타 여러 프로그램에서 단순 경로명으로 (즉 슬래시가 없는 경로명으로) 지정한 실행 파일을 탐색할 때 이용하는 디렉터리 선두부들의 목록. 선두부들이 콜론(:)으로 구분돼 있다. 선두부 목록을 처음부터 차례로 순회하면서 선두부와 파일명을 슬래시로 이어 붙여 만든 경로명을 확인해서 실행 권한이 있는 파일을 찾는다.

길이 0인 선두부(콜론 두 개를 연달아 쓰거나 처음이나 끝에 콜론을 써서 지정)를 현재 작업 디렉터리를 나타내는 것으로 해석하는 오래된 기능이 있다. 하지만 이 기능을 쓰지 말아야 하며, POSIX에서는 준수 응용에서 명확한 경로명(가령 .)을 써서 현재 작업 디렉터리를 지정해야 한다고 언급하고 있다.

PATH와 비슷하게 일부 셸에는 디렉터리 변경 명령 대상을 찾는 데 쓰는 CDPATH가 있고, man(1)에서 매뉴얼 페이지를 찾는 데 쓰는 MANPATH가 있기도 하다.

PWD
현재 작업 디렉터리. 일부 셸에서 설정해 준다.
SHELL
사용자 로그인 셸의 절대 경로명. 로그인 시점에 설정됨. 아래 NOTES 참고.
TERM
터미널 종류. 출력 내용이 여기에 맞춰진다.
PAGER
텍스트 파일 표시를 위한 사용자 선호 유틸리티. sh -c 명령에 command_string 인자로 줄 수 있는 어떤 문자열이든 유효하다. PAGER가 비어 있거나 설정돼 있지 않으면 페이저를 띄우는 응용에서 기본으로 less(1)more(1) 같은 프로그램을 쓰게 된다.
EDITOR/VISUAL
텍스트 파일 편집을 위한 사용자 선호 유틸리티. sh -c 명령에 command_string 인자로 줄 수 있는 어떤 문자열이든 유효하다.

참고로 특정 환경 변수의 값이나 존재 여부가 여러 프로그램 및 라이브러리 루틴의 동작에 영향을 준다. 예로 다음이 있다.

NOTES

역사적으로 그리고 표준상, 사용자 프로그램에서 environ을 선언해야 한다. 하지만 (비표준으로) 프로그래머의 편의를 위해서 기능 확인 매크로 _GNU_SOURCE가 정의돼 있으면 (feature_test_macros(7) 참고) 헤더 파일 <unistd.h>environ이 선언돼 있다.

prctl(2)PR_SET_MM_ENV_STARTPR_SET_MM_ENV_END 동작을 이용해 프로세스 환경의 위치를 제어할 수 있다.

HOME, LOGNAME, SHELL, USER 변수는 세션 관리 인터페이스를 통해 사용자가 바뀔 때 설정되는데, 보통 login(1) 같은 프로그램이 (passwd(5) 같은) 사용자 데이터베이스에서 값을 가져다 설정한다. (su(1)를 써서 root 사용자로 전환하면 LOGNAMEUSER에 이전 사용자가 유지되는 뒤섞인 환경이 생길 수 있다. su(1) 매뉴얼 페이지 참고.)

BUGS

명백히 여기에는 보안상의 위험이 있다. IFSLD_LIBRARY_PATH에 이상한 값을 지정한 사용자에게 속아서 여러 시스템 명령들이 오동작하곤 했다.

이름 공간 오염 위험도 있다. makeautoconf 같은 프로그램에선 환경에 대문자로 된 비슷한 이름의 변수를 써서 기본 유틸리티의 이름을 바꿀 수 있다. 가령 CC를 이용해 원하는 C 컴파일러를 선택한다. (비슷하게 MAKE, AR, AS, FC, LD, LEX, RM, YACC 등이 있다.) 하지만 일부 전통적 용법에서는 그런 환경 변수를 가지고 경로명이 아니라 프로그램 옵션을 지정한다. 가령 MORE, LESS, GZIP 등이 있다. 이 용법은 잘못된 것이고 새로운 프로그램에서는 피해야 한다. gzip 작성자들은 옵션 이름을 GZIP_OPT로 바꾸는 걸 고려할 필요가 있다.

SEE ALSO

bash(1), csh(1), env(1), login(1), printenv(1), sh(1), su(1), tcsh(1), execve(2), clearenv(3), exec(3), getenv(3), putenv(3), setenv(3), unsetenv(3), locale(7), ld.so(8), pam_env(8)


2021-03-22