리눅스 환경 변수 이해하기

LinuxBeginner
지금 연습하기

소개

리눅스 환경 변수를 다루는 실습에 오신 것을 환영합니다! 환경 변수는 컴퓨터에서 실행 중인 프로세스의 동작에 영향을 줄 수 있는 동적인 값입니다. 시스템 설정과 프로그램 실행에서 매우 중요한 역할을 합니다. 환경 변수를 능숙하게 다루게 되면 리눅스 시스템 관리와 소프트웨어 개발에 필요한 핵심 역량을 갖추게 됩니다.

이번 실습에서는 환경 변수를 생성, 조회, 수정 및 삭제하는 방법을 배웁니다. 또한 이러한 변경 사항을 영구적으로 적용하는 방법을 알아보고, 리눅스에 내장된 가장 중요한 환경 변수들을 살펴볼 것입니다. 초보자이든 지식을 공고히 하려는 분이든, 이 실습은 가치 있는 실무 경험을 제공할 것입니다.

그럼 시작해 보겠습니다!

이 과정은 단계별 안내에 따라 학습하고 실습할 수 있는 가이드 랩입니다. 각 단계를 주의 깊게 따라하며 실무 경험을 쌓으세요. 통계에 따르면 이 실습은 초급 수준이며, 91%의 수료율과 학습자들로부터 98%의 긍정적인 평가를 받았습니다.

리눅스 변수 이해하기

환경 변수를 본격적으로 다루기 전에, 먼저 기본적인 쉘 변수부터 시작해 보겠습니다. 이를 통해 리눅스에서 변수가 어떤 개념인지 파악할 수 있습니다.

  1. 터미널을 엽니다. 현재 위치가 /home/labex/project 디렉토리여야 합니다. 만약 아니라면 다음 명령어를 사용하여 해당 디렉토리로 이동하세요.

    cd /home/labex/project
  2. 이제 간단한 쉘 변수를 만들어 보겠습니다. 리눅스에서는 이름에 값을 할당하는 것만으로 변수를 생성할 수 있습니다. my_var라는 이름의 변수를 만들어 봅시다.

    my_var="Hello, Linux"

    주의 사항: Bash(및 이번 실습에서 사용하는 Zsh) 에서 변수를 할당할 때는 등호 (=) 앞뒤에 공백이 없어야 합니다. my_var = "Hello, Linux" 또는 my_var= "Hello, Linux"와 같이 입력하면 오류가 발생합니다.

  3. 변수의 값을 확인하려면 echo 명령어와 함께 변수 이름 앞에 $ 기호를 붙여 사용합니다. $ 기호는 쉘에게 해당 변수의 값으로 치환하라는 의미를 전달합니다.

    echo $my_var

    다음과 같은 결과가 출력되어야 합니다.

    Hello, Linux
  4. 변수를 다른 명령어 내부나 다른 할당문에서도 사용할 수 있습니다. 예를 들어 다음과 같습니다.

    echo "The value of my_var is: $my_var"

    출력 결과: The value of my_var is: Hello, Linux

잘하셨습니다! 첫 번째 쉘 변수를 성공적으로 생성하고 사용해 보았습니다. 하지만 이 변수는 현재 쉘 세션에서만 유효합니다. 새 터미널 창이나 탭을 열면 이 변수는 더 이상 존재하지 않습니다. 바로 이 지점에서 환경 변수가 필요해집니다.

환경 변수 입문

기본 변수를 이해했으니 이제 환경 변수를 살펴보겠습니다. 환경 변수는 쉘의 모든 자식 프로세스에서 사용할 수 있는 변수입니다. 즉, 해당 쉘에서 실행되는 스크립트나 프로그램들이 이 변수에 접근할 수 있다는 뜻입니다.

  1. 현재 설정된 모든 환경 변수를 확인하려면 env 명령어를 사용합니다.

    env

    변수 목록이 길게 나열될 것입니다. 지금 당장 모든 내용을 이해하지 못해도 괜찮습니다. 중요한 변수들은 나중에 자세히 다룰 예정입니다.

  2. 가장 중요한 환경 변수 중 하나는 PATH입니다. 내용을 확인해 봅시다.

    echo $PATH

    PATH 변수는 시스템이 실행 프로그램을 찾을 때 검색하는 디렉토리 목록을 담고 있습니다. 각 디렉토리는 콜론 (:) 으로 구분됩니다.

  3. 이제 직접 환경 변수를 만들어 보겠습니다. 환경 변수를 생성할 때는 export 명령어를 사용합니다.

    export MY_ENV_VAR="This is an environment variable"

    export 명령어는 해당 변수를 자식 프로세스에서도 사용할 수 있게 만듭니다. 이것이 일반 쉘 변수와 환경 변수의 핵심적인 차이점입니다.

  4. 차이점을 확인하기 위해, 일반 쉘 변수와 환경 변수 모두에 접근을 시도하는 쉘 스크립트를 만들어 보겠습니다. 여러 줄의 내용을 파일에 쓸 때 자주 사용하는 cat 명령어와 heredoc 방식을 사용합니다.

    cat << 'EOF' > test_vars.sh
    #!/bin/bash
    echo "Shell variable: $my_var"
    echo "Environment variable: $MY_ENV_VAR"
    EOF

    스크립트에 실행 권한을 부여합니다.

    chmod +x test_vars.sh

    이제 스크립트를 실행합니다.

    ./test_vars.sh

    환경 변수인 MY_ENV_VAR는 정상적으로 출력되지만, 쉘 변수인 my_var는 출력되지 않는 것을 확인할 수 있습니다. 이는 my_var가 내보내기 (export) 되지 않았기 때문에 자식 프로세스 (이 스크립트) 가 해당 변수의 존재를 알지 못하기 때문입니다.

  5. MY_ENV_VAR가 환경 변수로 등록되었는지 다시 확인하려면 env 명령어를 사용하되, grep으로 결과를 필터링해 봅니다.

    env | grep MY_ENV_VAR

    출력 결과에서 새로 만든 변수를 확인할 수 있습니다.

  6. 환경 변수의 값을 직접 확인할 수도 있습니다.

    echo $MY_ENV_VAR

훌륭합니다! 첫 환경 변수를 생성하고 쉘 변수와의 차이점을 직접 확인했습니다. 핵심은 export로 생성된 환경 변수는 자식 프로세스에서 사용할 수 있지만, 일반 쉘 변수는 그렇지 않다는 점입니다.

환경 변수와 쉘 변수는 각각 고유한 범위를 가집니다. 변수를 내보내면 (예: export MY_ENV_VAR="something"), 해당 쉘에서 시작된 모든 하위 프로세스 (예: 해당 쉘에서 실행한 스크립트) 에서 사용할 수 있습니다. 하지만 완전히 별개의 쉘 세션을 열면, .zshrc.bashrc 같은 설정 파일에 명시적으로 설정하지 않는 한 현재 쉘의 변수를 상속받지 않습니다.

요약하자면 다음과 같습니다.

  • 일반 쉘 변수는 현재 세션 내부에서만 보입니다.
  • 내보낸 (Exported) 변수는 해당 세션에서 실행된 자식 프로세스에서 사용할 수 있습니다.
  • 쉘 설정 파일 (예: .zshrc) 에 설정된 변수는 해당 쉘의 모든 새로운 세션에 적용됩니다.

각 프로세스는 자신만의 환경을 유지하므로 다른 사용자나 다른 쉘의 변수를 직접 읽을 수는 없습니다. 새 쉘을 시작하면 부모 쉘의 내보낸 변수 복사본은 받지만, export 없이 설정된 변수는 전달받지 못합니다.

다음 단계에서는 환경 변수를 영구적으로 설정하는 방법을 배우겠습니다.

변수 지속성 수준

이러한 변수 유형과 지속성 수준의 차이를 시각화하면 다음과 같습니다.

graph LR A["리눅스 변수 유형"] --> B["쉘 변수"] A --> C["환경 변수"] A --> D["영구 변수"] B --> B1["세션 전용"] B --> B2["상속 안 됨"] B --> B3["종료 시 소멸"] C --> C1["세션 범위"] C --> C2["자식 프로세스 접근 가능"] C --> C3["종료 시 소멸"] D --> D1["모든 세션 적용"] D --> D2["자식 프로세스 접근 가능"] D --> D3["지속 유지"] B1 --> E1["my_var='value'"] C2 --> E2["export VAR='value'"] D3 --> E3["~/.zshrc 파일 설정"] style B fill:#ffebee style C fill:#fff3e0 style D fill:#e8f5e8

이 다이어그램은 변수 지속성의 세 단계를 보여줍니다. 빠른 참조를 위한 요약 표입니다.

변수 유형 범위 자식 프로세스 접근 지속성 문법 예시
쉘 변수 현재 세션 전용 아니오 종료 시 소멸 my_var='value'
환경 변수 현재 세션 종료 시 소멸 export VAR='value'
영구 변수 모든 새 세션 종료 후에도 유지 ~/.zshrc 파일에 작성

이 세 가지 수준을 이해하는 것은 효율적인 리눅스 시스템 관리를 위해 필수적이며, 상황에 맞는 적절한 접근 방식을 선택하는 데 도움이 됩니다.

PATH 환경 변수 수정하기

PATH 변수는 리눅스에서 가장 중요한 환경 변수 중 하나입니다. 시스템이 실행 파일을 어디에서 찾을지 알려주는 역할을 합니다. 새로운 디렉토리를 포함하도록 이 변수를 수정해 보겠습니다.

  1. 먼저 커스텀 스크립트를 저장할 새로운 디렉토리를 만듭니다.

    mkdir ~/my_scripts

    홈 디렉토리에 my_scripts라는 디렉토리가 생성됩니다. ~ 기호는 홈 디렉토리 경로의 축약형으로, 이 실습 환경에서는 /home/labex를 의미합니다.

  2. 이제 이 디렉토리를 PATH에 추가해 보겠습니다. export 명령어를 사용하되, 기존 변수의 내용을 수정하는 방식을 취합니다.

    export PATH="$PATH:$HOME/my_scripts"

    명령어의 의미를 분석해 봅시다.

    • $PATH는 현재 PATH 환경 변수의 값입니다. 기존 값을 그대로 유지하면서 내용을 덧붙입니다.
    • :은 PATH 내에서 디렉토리를 구분하는 구분자입니다. 콜론을 빠뜨리면 쉘이 추가된 디렉토리에서 실행 파일을 찾지 못합니다.
    • $HOME은 사용자의 홈 디렉토리를 가리키는 환경 변수입니다 (여기서는 /home/labex).
    • 결과적으로 기존 PATH 뒤에 :$HOME/my_scripts를 추가한 것입니다. 이는 시스템이 원래 PATH에 있던 디렉토리들을 먼저 검색한 후에 my_scripts 디렉토리에서 실행 파일을 찾도록 설정합니다.
  3. 새로운 디렉토리가 추가되었는지 확인합니다.

    echo $PATH

    출력 결과의 마지막 부분에 /home/labex/my_scripts가 보여야 합니다.

  4. 테스트를 위해 새 디렉토리에 간단한 스크립트를 생성합니다.

    cat << 'EOF' > ~/my_scripts/hello.sh
    #!/bin/zsh
    echo "Hello from my custom script!"
    EOF

    ~/my_scripts 디렉토리에 hello.sh라는 쉘 스크립트가 생성되었습니다. 첫 줄의 #!/bin/zsh는 이 파일이 zsh 스크립트임을 시스템에 알려주어 프로그램처럼 실행될 수 있게 합니다.

  5. 스크립트에 실행 권한을 부여합니다.

    chmod +x ~/my_scripts/hello.sh

    chmod +x 명령어는 스크립트에 실행 권한을 추가합니다. 이 단계를 거치지 않으면 실행 시 "permission denied(권한 거부)" 오류가 발생합니다.

  6. 이제 어느 위치에서든 스크립트 이름만 입력하여 실행할 수 있습니다.

    hello.sh

    모든 설정이 올바르다면 Hello from my custom script!라는 문구가 출력됩니다.

이것이 가능한 이유는 my_scripts 디렉토리를 PATH에 추가했기 때문입니다. 명령어를 입력하면 쉘은 PATH에 나열된 디렉토리들을 순서대로 뒤져서 해당 이름의 실행 파일을 찾습니다.

이를 확인하기 위해 다른 디렉토리로 이동한 후 스크립트를 다시 실행해 보세요.

cd /tmp
hello.sh

스크립트가 있는 디렉토리에 있지 않음에도 불구하고 여전히 잘 실행되는 것을 볼 수 있습니다. 이것이 PATH 변수의 힘입니다. PATH에 등록된 디렉토리에만 있다면 시스템 어디서든 실행 파일을 호출할 수 있습니다.

잘하셨습니다! PATH 환경 변수를 성공적으로 수정하고 어디서나 실행 가능한 커스텀 스크립트를 만들었습니다.

환경 변수 영구적으로 적용하기

지금까지 설정한 환경 변수들은 터미널을 닫으면 사라집니다. 이를 영구적으로 유지하려면 쉘 설정 파일에 추가해야 합니다. 어떤 파일을 수정해야 하는지는 사용 중인 쉘의 종류에 따라 다릅니다.

이 실습 환경에서는 Z 쉘 (zsh) 을 사용하고 있습니다. Zsh 는 Bourne Shell(sh) 의 확장판으로, Bash, ksh, tcsh 의 장점을 포함한 많은 개선 사항을 담고 있습니다. 현재 macOS 의 기본 쉘이기도 합니다.

만약 Bash 를 사용 중이라면 .bashrc를 수정하겠지만, 우리는 Zsh 를 사용하므로 .zshrc를 수정해야 합니다. 올바른 파일을 사용하는 것이 매우 중요합니다. Zsh 를 사용하면서 .bashrc 를 수정하면 변수가 적용되지 않습니다.

  1. 텍스트 에디터로 홈 디렉토리의 .zshrc 파일을 엽니다. 여기서는 사용법이 간단한 터미널 기반 에디터인 nano를 사용하겠습니다.

    nano ~/.zshrc

    이 파일은 새로운 터미널 세션이 시작될 때마다 실행됩니다.

  2. 파일의 맨 아래로 이동하여 (화살표 키 사용) 다음 줄을 추가합니다.

    export MY_ENV_VAR="This is an environment variable"
    export PATH="$PATH:$HOME/my_scripts"

    반드시 파일의 최하단에 추가하세요. 오타가 없는지, 특히 = 앞뒤에 공백이 없는지 다시 한번 확인하세요.

  3. 파일을 저장하고 에디터를 종료합니다. nano 에서는 Ctrl+X를 누른 뒤, Y(저장 확인), 그리고 Enter를 누르면 됩니다.

  4. 터미널을 재시작하지 않고 변경 사항을 즉시 적용하려면 source 명령어를 사용합니다.

    source ~/.zshrc

    source 명령어는 지정된 파일의 명령어를 현재 쉘 환경에서 직접 읽어서 실행합니다. 단순히 bash ~/.zshrc라고 실행하는 것과는 다릅니다. 후자는 새로운 쉘에서 스크립트를 실행하므로 현재 쉘에는 영향을 주지 않지만, source현재 쉘에 즉시 반영합니다. 이 단계를 건너뛰면 현재 터미널에서는 변경 사항이 나타나지 않으며, 터미널을 껐다 켜야만 적용됩니다.

이제 이 환경 변수들은 새 터미널을 열 때마다 자동으로 설정됩니다. 이는 개발 환경을 일관되게 유지하는 데 매우 유용합니다.

주요 내장 환경 변수 이해하기

리눅스에는 시스템 운영에 필수적인 여러 내장 환경 변수가 있습니다. 몇 가지를 살펴보겠습니다.

  1. HOME: 현재 사용자의 홈 디렉토리 경로를 가리킵니다.

    echo $HOME
  2. USER: 현재 로그인한 사용자의 이름을 담고 있습니다.

    echo $USER
  3. SHELL: 사용자의 기본 쉘 경로를 지정합니다.

    echo $SHELL
  4. PWD: "Print Working Directory"의 약자로, 현재 작업 중인 디렉토리 경로를 담고 있습니다.

    echo $PWD
  5. TERM: 쉘을 실행할 때 에뮬레이션할 터미널 유형을 지정합니다.

    echo $TERM

이러한 변수들을 이해하면 리눅스 환경을 더 잘 파악하고 제어할 수 있습니다.

환경 변수 해제하기

때로는 설정된 환경 변수를 제거해야 할 때가 있습니다. 이럴 때는 unset 명령어를 사용합니다.

  1. 먼저 MY_ENV_VAR가 여전히 설정되어 있는지 확인합니다.

    echo $MY_ENV_VAR

    이전에 설정한 값이 출력될 것입니다.

  2. 이 변수를 해제 (제거) 하려면 unset 명령어를 사용합니다.

    unset MY_ENV_VAR
  3. 변수가 해제되었는지 확인합니다.

    echo $MY_ENV_VAR

    아무것도 출력되지 않아야 하며, 이는 변수가 더 이상 존재하지 않음을 의미합니다.

  4. 쉘 함수가 아닌 변수를 확실히 해제하기 위해 -v 옵션을 함께 사용할 수도 있습니다.

    unset -v MY_ENV_VAR

    결과는 일반 unset과 동일합니다.

참고로, .zshrc 파일에 변수를 추가해 두었다면, 다음에 터미널을 새로 열거나 .zshrc 파일을 다시 source할 때 해당 변수가 다시 생성됩니다.

요약

축하합니다! 리눅스 환경 변수에 관한 종합 실습을 마쳤습니다. 학습한 내용을 정리해 보겠습니다.

  1. 단순 쉘 변수를 생성하고 접근하며 그 유효 범위를 이해했습니다.
  2. 환경 변수의 개념과 쉘 변수와의 차이점 (특히 자식 프로세스로의 상속 여부) 을 배웠으며, export 명령어의 핵심 역할을 파악했습니다.
  3. 중요한 PATH 변수를 수정하여 커스텀 디렉토리를 추가함으로써 시스템 어디서나 스크립트를 실행하는 방법을 익혔고, 구분자 콜론 (:) 의 중요성을 배웠습니다.
  4. .zshrc 파일에 변수를 추가하여 영구적으로 적용하는 방법을 배웠으며, Bash 와 Zsh 설정 파일의 차이 및 source 명령어의 즉시 반영 효과를 이해했습니다.
  5. 리눅스 시스템의 주요 내장 환경 변수들을 살펴보았습니다.
  6. 마지막으로 unset 명령어를 사용하여 환경 변수를 제거하는 방법을 배웠습니다.

이러한 기술은 리눅스 시스템 관리와 소프트웨어 개발의 기초가 됩니다. 환경 변수를 활용하면 시스템과 애플리케이션을 유연하게 설정할 수 있습니다. 리눅스를 계속 사용하면서 스크립팅, 개발, 시스템 설정 등 다양한 분야에서 환경 변수가 어떻게 활용되는지 탐구해 보세요. 수고하셨습니다!