리눅스에서 정확히 환경변수가 어떻게 쓰이는것인가요? 쉘이 동

graduallyConquer의 이미지

쉘로 인해서 실행되는 다른 프로그램도 해당 환경변수들에 접근
할수가 있는것인가요??? 쉘이 생성하는 프로세스이기때문에,
상속이 된다고 들었거든요.

좀 알려주세요~

dotri의 이미지

지금 설명하는 내용은 리눅스에 국한된것이 아니라, 오래 전 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 페이지를 참조하시기 바랍니다.

graduallyConquer의 이미지

이런 사소한 질문에 이렇게 성의껏 대답해 주신것에 대해서 감사드립니다.

익명 사용자의 이미지

참고로 셸의 경우, export 시키지 않으면, 현재 셸이 아닌 다른 셸은 상속받지 못하는 것으로 알고있습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.