지금 설명하는 내용은 리눅스에 국한된것이 아니라, 오래 전 MS-DOS 에서부터 모든 Windows 계열 운영체제와, 그리고 현존하는 모든 유닉스에도 적용되는 사항입니다.
사용자가 내린 명령을 해석하고, 응용프로그램을 실행시켜주는 프로그램을 쉘(shell)이라고 하죠. 쉘은 사용자의 명령을 해석해주는 것이 가장 큰 역할입니다만, 자잘한 다른 일들도 많이 하는 복잡한 프로그램입니다. 쉘이 하는 큰 역할중 하나가 바로 환경변수 관리입니다. 환경변수는 시스템에 관련된 여러가지 데이터나 사항들을 일괄적으로 관리하기 위한 방법입니다. 일종의 "변수" 이므로, 사람이 보기에는 "변수이름 = 값" 의 형태로 이루어져 있습니다. 예를 들어서, 다음은 제 Windows Server 2003 운영체제에서 환경변수의 목록을 출력한 것입니다.
Microsoft Windows [Version 5.2.3790]
(C) Copyright 1985-2003 Microsoft Corp.
C:\Documents and Settings\Administrator>set
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\Administrator\Application Data
CLIENTNAME=Console
ClusterLog=C:\WINDOWS\Cluster\cluster.log
CommonProgramFiles=C:\Program Files\Common Files
... 중략
C:\Documents and Settings\Administrator>
윈도우의 쉘중 하나인 command.exe 가 관리하는 환경변수의 목록입니다. CLIENTNAME 이라는 변수에는 "Console" 이라는 값이 들어있음을 알 수 있습니다.
쉘의 가장 중요한 기능이 사용자의 명령을 해석해서 응용프로그램을 실행시켜주는 것이라고 설명드렸는데.. 이때 쉘에 의해서 실행되는 모든 응용프로그램은 쉘이 관리하는 환경변수를 그대로 상속받습니다. 님께서 알고계신 그대로입니다. 모든 응용프로그램에서는 환경변수를 읽거나, 환경변수의 값을 변경할 수 있습니다. 환경변수는 시스템에 관련된 데이터를 담고 있기 때문에, 응용프로그램에서 시스템에 관한 데이터가 필요하다면 환경변수를 읽기만 하면 됩니다. 대표적인 경우가 리눅스의 hanterm, xterm 같은 터미널 프로그램입니다. 이 프로그램들은 현재 사용자가 사용하고 있는 터미널의 종류에 맞춰서, 색상을 표현해야하는지 내지는 줄바꿈을 위해 CR+LF 를 사용해야하는지 등의 처리를 달리 해주어야 합니다. 사용자가 사용하고 있는 터미널의 종류를 알기 위해 TERM 이라는 환경변수를 참조합니다.
응용프로그램의 입장에서 봤을때, 환경변수는 자신이 사용할 수 있는 중요한 정보자원이 됩니다. 시스템에 관한 어떤 사항이 필요한데, 그것을 시스템에서 직접 구해오기에는 처리가 너무 복잡한 경우, 간단하게 환경변수를 참조하는 것만으로 해결할 수도 있습니다. 응용프로그램이 환경변수를 참조할것인가 참조하지 않을것인가는 전적으로 응용프로그램에게 달려있습니다만, 환경변수를 사용하던지 사용하지 않던지 관계없이 일단 무조건 환경변수는 응용프로그램에게 전달됩니다.
이 게시판이 프로그래밍 Q/A 게시판이 아닌 관계로, 가급적이면 코드는 적지 않으려했으나 질문에 대해 좀 더 명확한 답을 하려면 아무래도 적어야될것 같군요.
C 언어로 작성된 모든 프로그램은 main() 함수를 엔트리 포인트로 합니다. 이때 main() 함수는 다음과 같은 프로토타입으로 사용하는것이 일반적입니다.
int main( int argc, char *argv[] );
하지만 현존하는 대부분의 운영체제에서는 main() 함수의 프로토타입이 하나 더 늘어났습니다. 바로 다음과 같은 형태입니다.
int main( int argc, char *argv[], char *env[] );
새롭게 추가된 main() 함수의 세번째 인자 env 는, 쉘이 이 프로그램에게 상속해준 환경변수의 목록이 들어있습니다. 만일 프로그램에서 환경변수의 특정 값이 필요하다면 env 변수를 검색하는 것으로 찾을 수 있습니다.
프로그램에서 환경변수에 접근할 수 있는 또 다른 방법은 POSIX.1 표준에 명시된 인터페이스 함수를 사용하는 것입니다. 다음과 같은 함수를 사용할 수 있습니다.
#include <stdlib.h>
char *getenv( const char *name );
int setenv( const char *name, const char *value, int overwrite );
위 두 함수를 사용해서 환경변수의 값을 얻어오거나 변경할 수 있습니다. 구체적은 사용법은 man 페이지를 참조하시기 바랍니다.
....
지금 설명하는 내용은 리눅스에 국한된것이 아니라, 오래 전 MS-DOS 에서부터 모든 Windows 계열 운영체제와, 그리고 현존하는 모든 유닉스에도 적용되는 사항입니다.
사용자가 내린 명령을 해석하고, 응용프로그램을 실행시켜주는 프로그램을 쉘(shell)이라고 하죠. 쉘은 사용자의 명령을 해석해주는 것이 가장 큰 역할입니다만, 자잘한 다른 일들도 많이 하는 복잡한 프로그램입니다. 쉘이 하는 큰 역할중 하나가 바로 환경변수 관리입니다. 환경변수는 시스템에 관련된 여러가지 데이터나 사항들을 일괄적으로 관리하기 위한 방법입니다. 일종의 "변수" 이므로, 사람이 보기에는 "변수이름 = 값" 의 형태로 이루어져 있습니다. 예를 들어서, 다음은 제 Windows Server 2003 운영체제에서 환경변수의 목록을 출력한 것입니다.
윈도우의 쉘중 하나인 command.exe 가 관리하는 환경변수의 목록입니다. CLIENTNAME 이라는 변수에는 "Console" 이라는 값이 들어있음을 알 수 있습니다.
쉘의 가장 중요한 기능이 사용자의 명령을 해석해서 응용프로그램을 실행시켜주는 것이라고 설명드렸는데.. 이때 쉘에 의해서 실행되는 모든 응용프로그램은 쉘이 관리하는 환경변수를 그대로 상속받습니다. 님께서 알고계신 그대로입니다. 모든 응용프로그램에서는 환경변수를 읽거나, 환경변수의 값을 변경할 수 있습니다. 환경변수는 시스템에 관련된 데이터를 담고 있기 때문에, 응용프로그램에서 시스템에 관한 데이터가 필요하다면 환경변수를 읽기만 하면 됩니다. 대표적인 경우가 리눅스의 hanterm, xterm 같은 터미널 프로그램입니다. 이 프로그램들은 현재 사용자가 사용하고 있는 터미널의 종류에 맞춰서, 색상을 표현해야하는지 내지는 줄바꿈을 위해 CR+LF 를 사용해야하는지 등의 처리를 달리 해주어야 합니다. 사용자가 사용하고 있는 터미널의 종류를 알기 위해 TERM 이라는 환경변수를 참조합니다.
응용프로그램의 입장에서 봤을때, 환경변수는 자신이 사용할 수 있는 중요한 정보자원이 됩니다. 시스템에 관한 어떤 사항이 필요한데, 그것을 시스템에서 직접 구해오기에는 처리가 너무 복잡한 경우, 간단하게 환경변수를 참조하는 것만으로 해결할 수도 있습니다. 응용프로그램이 환경변수를 참조할것인가 참조하지 않을것인가는 전적으로 응용프로그램에게 달려있습니다만, 환경변수를 사용하던지 사용하지 않던지 관계없이 일단 무조건 환경변수는 응용프로그램에게 전달됩니다.
이 게시판이 프로그래밍 Q/A 게시판이 아닌 관계로, 가급적이면 코드는 적지 않으려했으나 질문에 대해 좀 더 명확한 답을 하려면 아무래도 적어야될것 같군요.
C 언어로 작성된 모든 프로그램은 main() 함수를 엔트리 포인트로 합니다. 이때 main() 함수는 다음과 같은 프로토타입으로 사용하는것이 일반적입니다.
int main( int argc, char *argv[] );
하지만 현존하는 대부분의 운영체제에서는 main() 함수의 프로토타입이 하나 더 늘어났습니다. 바로 다음과 같은 형태입니다.
int main( int argc, char *argv[], char *env[] );
새롭게 추가된 main() 함수의 세번째 인자 env 는, 쉘이 이 프로그램에게 상속해준 환경변수의 목록이 들어있습니다. 만일 프로그램에서 환경변수의 특정 값이 필요하다면 env 변수를 검색하는 것으로 찾을 수 있습니다.
프로그램에서 환경변수에 접근할 수 있는 또 다른 방법은 POSIX.1 표준에 명시된 인터페이스 함수를 사용하는 것입니다. 다음과 같은 함수를 사용할 수 있습니다.
위 두 함수를 사용해서 환경변수의 값을 얻어오거나 변경할 수 있습니다. 구체적은 사용법은 man 페이지를 참조하시기 바랍니다.
^_^-
이런 사소한 질문에 이렇게 성의껏 대답해 주신것에 대해서 감사드립니다.
참고로 셸의 경우, export 시키지 않으면, 현재 셸이 아닌 다른 셸
참고로 셸의 경우, export 시키지 않으면, 현재 셸이 아닌 다른 셸은 상속받지 못하는 것으로 알고있습니다.
댓글 달기