-
Notifications
You must be signed in to change notification settings - Fork 7
environ(7)
environ - 사용자 환경
extern char **environ;변수 environ은 문자열 포인터들의 배열을 가리키는데 이를 "환경"이라고 한다. 그 배열의 마지막 포인터는 NULL 값이다. (사용자 프로그램 내에서 이 변수를 선언해야 한다. 단 기능 확인 매크로 _GNU_SOURCE가 정의돼 있으면 헤더 파일 <unistd.h>에 선언돼 있다.) exec(3) 호출에서 프로세스를 시작할 때 프로세스에서 사용 가능하도록 이 문자열 배열을 준비해 준다. fork(2)를 통해 자식 프로세스가 만들어질 때 부모 환경의 사본을 물려받는다.
관행상 environ의 문자열들은 "name=value" 형태다. 자주 쓰는 것들로 다음이 있다.
USER- 로그인 한 사용자의 이름. (일부 BSD 유래 프로그램들에서 사용.)
LOGNAME- 로그인 한 사용자의 이름. (일부 시스템 V 유래 프로그램들에서 사용.)
HOME- 사용자의 로그인 디렉터리. 암호 파일
passwd(5)에서 가져와서login(1)에서 설정. LANG- 로캘 카테고리들에 사용할 로캘 이름.
LC_ALL이, 또는 더 상세한 환경 변수LC_COLLATE,LC_CTYPE,LC_MESSAGES,LC_MONETARY,LC_NUMERIC,LC_TIME등이 있으면 그게 우선시됨. (LC_*환경 변수들에 대한 자세한 내용은 locale(7) 참고.) PATH-
sh(1)및 기타 여러 프로그램에서 경로명을 불완전하게 알고 있는 파일을 탐색할 때 적용하는 디렉터리 선두부들의 목록. 선두부들이 ':'로 구분돼 있다. (이와 비슷하게 일부 셸에는 디렉터리 변경 명령 대상을 찾는 데 쓰는CDPATH가 있고,man(1)에서 매뉴얼 페이지를 찾는 데 쓰는MANPATH가 있기도 하다.) PWD- 현재 작업 디렉터리. 일부 셸에서 설정해 준다.
SHELL- 사용자 로그인 셸의 경로명.
TERM- 출력 방식을 맞출 터미널 종류.
PAGER- 텍스트 파일 표시를 위한 사용자 선호 유틸리티.
-
EDITOR/VISUAL - 텍스트 파일 편집을 위한 사용자 선호 유틸리티.
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) 함수를 사용해 자기 환경을 조작할 수 있다.
참고로 특정 환경 변수의 값이나 존재 여부가 여러 프로그램 및 라이브러리 루틴의 동작에 영향을 준다. 예로 다음이 있다.
-
변수
LANG,LANGUAGE,NLSPATH,LOCPATH,LC_ALL,LC_MESSAGES등이 로캘 처리에 영향을 준다. catopen(3), gettext(3), locale(7) 참고. -
TMPDIR이 tempnam(3) 등의 루틴에서 만드는 이름의 경로 선두부와sort(1)등의 프로그램에서 쓰는 임시 디렉터리에 영향을 준다. -
LD_LIBRARY_PATH,LD_PRELOAD, 여타LD_*변수들이 동적 로더/링커의 동작에 영향을 준다. -
POSIXLY_CORRECT가 특정 프로그램 및 라이브러리 루틴들이 POSIX 규정을 따르게 만든다. -
MALLOC_*변수들이 malloc(3)의 동작에 영향을 준다. -
HOSTALIASES변수로 지정한 파일에 담긴 별명들을 gethostbyname(3)에서 사용한다. -
TZ및TZDIR의 시간대 정보를 tzset(3)에서, 그리고 그 함수를 이용하는 ctime(3), localtime(3), mktime(3), strftime(3) 같은 함수들에서 사용한다.tzselect(8)도 참고. -
TERMCAP은 해당 터미널을 어떻게 다룰지에 대한 정보를 (또는 그런 정보를 담은 파일 이름을) 준다. -
COLUMNS와LINES는 창 크기를 응용에게 알려 준다. 실제 크기과 다르게 지정할 수도 있다. -
PRINTER나LPDEST로 사용하려는 프린터를 나타낼 수 있다.lpr(1)참고.
prctl(2)의 PR_SET_MM_ENV_START 및 PR_SET_MM_ENV_END 동작을 이용해 프로세스 환경의 위치를 제어할 수 있다.
명백히 여기에는 보안상의 위험이 있다. IFS나 LD_LIBRARY_PATH에 이상한 값을 지정한 사용자에게 속아서 여러 시스템 명령들이 오동작 하곤 했다.
이름 공간 오염 위험도 있다. make나 autoconf 같은 프로그램에선 환경에 대문자로 된 비슷한 이름의 변수를 써서 기본 유틸리티의 이름을 바꿀 수 있다. 가령 CC를 이용해 원하는 C 컴파일러를 선택한다. (비슷하게 MAKE, AR, AS, FD, LD, LEX, RM, YACC 등이 있다.) 하지만 일부 전통적 용법에서는 그런 환경 변수로 경로명이 아니라 프로그램 옵션을 지정한다. 가령 MORE, LESS, GZIP 등이 있다. 이 용법은 잘못된 것이고 새로운 프로그램에서는 피해야 한다. gzip의 저자들은 옵션 이름을 GZIP_OPT로 바꾸는 걸 생각해 봐야 한다.
bash(1), csh(1), env(1), login(1), printenv(1), sh(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)
2017-09-15