Infra

[Linux] 환경변수 (Environment Variable) 개념과 활용

기억은 RAM, 기록은 HDD 2025. 5. 24. 02:23

cli 환경에서 쉘스크립트를 작성하거나 설정을 외부화 할 때 유용한 환경변수 (Environment Variable) 에 대해 정리한 글이다.

환경변수(Environment Variable) 개념

[환경변수란 무엇인가?]
환경변수(Environment Variable)는 운영체제에서 프로세스 실행 시점에 전달되는 설정값이다. 환경변수로 설정한 값은 실행 중인 애플리케이션에게 시스템 자원이나 경로, 사용자 세션, 디버그 모드 여부 등 여러 정보를 제공하는데 활용된다. 리눅스, macOS, Windows 모든 운영체제는 환경변수의 개념을 내장하고 있으며 환경변수를 통해 설정의 외부화가 가능해진다. 예를 들어, 애플리케이션의 데이터베이스 연결 정보를 환경변수 DB_HOST, DB_USER 등으로 설정하면, 코드 변경 없이 배포 환경별로 다른 데이터베이스에 연결할 수 있다.

 

[환경변수의 종류]
운영체제에서 관리하는 환경변수는 크게 시스템 환경변수와 사용자 환경변수로 나뉜다. 

 

시스템 환경변수는 운영체제 전체에 영향을 미치는 값이다. 모든 사용자와 모든 프로세스에서 공통으로 참조된다. 보통 루트 사용자나 시스템 설정 파일을 통해 설정하며, 시스템 부팅 시점부터 적용된다. 

  • /etc/environment : 시스템 전체 환경변수를 선언하는 기본 파일로 간단한 VAR=value 형식만 지원한다.

  • /etc/profile : 로그인 셸이 실행될 때 전체 사용자에게 적용된다. 비로그인 셸 전용 설정인 /etc/bash.bashrc를 로그인 셸에서도 실행되게 연결하는 설정이 존재한다. 이 로직 덕분에 로그인 시에도 bashrc에 등록된 설정들이 적용된다.

  • /etc/bash.bashrc : 비로그인 bash 셸에서 실행된다. 리눅스의 기본 로그인 쉘은 bash 쉘로 bashrc는 bash 쉘에서 사용하는 run command 라는 의미를 가진다. 

 

 

사용자 환경변수
특정 사용자에게만 적용되는 변수로 사용자의 홈 디렉토리에 위치한 설정 파일에 등록하며, 로그인 시점 또는 셸 실행 시 적용된다. 

  • ~/.profile : GUI 로그인, SSH 로그인, su - 사용자명 같은 로그인 셸일 때 한 번만 실행되며 이후 터미널을 여러 번 열더라도 비로그인 셸이면 다시 실행되지 않는다.

  • ~/.bashrc : bash 인터랙티브 셸이 시작될 때마다 실행된다.
  • ~/.zshrc : Zsh 을 사용하는 경우 ""  

설정 예시 (~/.bashrc):

export EDITOR=vim
export PATH="$HOME/bin:$PATH"

 

[환경변수 확인]
Linux/macOS에서는 printenv, env, set, echo 등을 통해 환경변수 값을 확인할 수 있다.

echo $PATH
echo $JAVA_HOME
env | grep CLASSPATH​

 

[환경변수 우선순위]

환경변수는 다음과 같은 우선순위로 적용된다.

  1. 셸에서 직접 export 현재 셸 세션에서 직접 export VAR=value로 설정한 값으로 최우선 적용되며 즉시 반영
  2. 스크립트 내부 export 셸 스크립트 안에서 정의된 환경변수로 스크립트 실행 중에만 유효
  3. ~/.bashrc: 비로그인 + 인터랙티브 셸 시작 시 적용되며 alias 및 사용자 정의 PATH 등에 사용
  4.  ~/.profile 로그인 셸에서 1회 실행 (SSH 접속 시 반영)
  5.  /etc/profile: 모든 사용자에게 적용되는 로그인 셸 공통 설정
  6.  /etc/bash.bashrc: 모든 사용자에게 적용되는 bash 인터랙티브 셸 설정
  7.  /etc/environment: 시스템 전체 기본 환경변수 설정

변수(Variable) 과 환경변수 (EnviromentVariable) 차이

변수 (Variable): 쉘에서 변수는 데이터를 저장하기 위한 이름 붙은 공간이다. 단순히 변수를 선언하고 값을 할당하는 것만으로는 그 변수가 환경변수가 되지 않는다. 예를 들어, MY_VAR="some_value"와 같이 선언된 변수는 현재 쉘에서만 사용할 수 있는 지역 변수다.

 

환경변수 (Environment Variable): 환경변수는 운영체제 수준에서 관리되는 이름-값 쌍의 집합으로서, 실행되는 프로세스에게 시스템 구성이나 실행 환경에 대한 정보를 제공하는 변수다. 프로세스가 시작될 때, 운영체제는 부모 프로세스의 환경변수들을 복사해 자식 프로세스에게 전달한다.

 

PATH 환경변수

PATH는 운영체제의 셸이 명령어를 찾는 기준이 되는 디렉토리들의 목록을 저장하는 환경변수다. 사용자가 터미널에서 javac, python, git 등의 명령을 입력하면, 운영체제는 PATH에 등록된 디렉토리들을 순서대로 탐색하여 해당 이름의 실행 파일을 찾는다.

 

터미널에 java를 입력했다고 가정하면 운영체제는 다음과 같은 절차로 실행 파일을 탐색한다.

  1. PATH 환경변수에 등록된 디렉토리를 앞에서부터 순서대로 순회
  2. 각 디렉토리 안에 java라는 이름의 실행 파일이 존재하는지 검사
  3. 발견 즉시 해당 실행 파일을 실행하고 탐색을 종료

현재 PATH 설정 상태를 확인하거나 수정하려면 다음과 같은 방법을 사용한다

echo $PATH
# 현재 PATH에 등록된 경로를 확인 (콜론으로 구분된 문자열)

export PATH="$HOME/bin:$PATH"
# $HOME/bin 경로를 PATH 맨 앞에 추가

앞에 추가하는 이유는, 사용자 정의 명령어가 시스템 기본 명령어보다 우선 실행되도록 하기 위함이다. PATH 를 설정할 때는 기존 PATH를 덮어쓰지 않도록 기존 PATH 를 유지하고 앞에 추가한다.

 

환경변수 export

변수를 선언하고 값을 할당하는 것만으로는 해당 변수가 자식 프로세스의 환경에 자동으로 상속되지 않는다. export 명령어를 사용해야 해당 변수가 환경변수로서 자식 프로세스에게 전달될 수 있다. export 명령어는 쉘 변수를 환경변수로 "승격"시키는 역할을 한다. 즉, 현재 쉘에서 정의된 변수를 자식 프로세스에게도 전달될 수 있는 환경변수로 등록한다.

 

[터미널 세션에서의 export]

터미널에서 export 명령어를 사용하여 환경변수를 설정하면, 그 효과는 해당 터미널 세션 동안 유지되며, 그 터미널에서 실행되는 모든 자식 프로세스에게 상속된다. 예를 들어, 다음과 같이 명령어를 입력하면 MY_VAR이라는 환경변수에 my_value가 할당되고, 이후 이 터미널에서 실행되는 모든 스크립트나 프로그램은 MY_VAR 환경변수의 값을 읽을 수 있다.

export MY_VAR="my_value"

 

해당 방식으로 설정된 환경변수는 현재 쉘이 종료되면 그 효력을 잃는다. 즉, 새로운 터미널 세션에서는 해당 환경변수가 다시 설정되지 않는 한 존재하지 않는다. 현재 작업하는 프로젝트에 필요한 설정을 해당 터미널 세션 내에서만 적용하고 싶을 때 사용할 수 있다.

 

[export 를 통한 전역 설정]

시스템 전체에 걸쳐 영구적으로 환경변수를 설정하려면, 쉘 설정 파일들을 수정해야 한다. 

  • 시스템 전체 설정 파일 (/etc/profile, /etc/bash.bashrc 등):  시스템에 로그인하는 모든 사용자에게 공통적으로 적용되는 시스템 환경변수를 설정할 수 있다.
  • 사용자별 설정 파일 (~/.bashrc, ~/.zshrc 등): 각 사용자의 홈 디렉토리에 있는 설정 파일을 수정하면 해당 사용자에게만 적용되는 환경변수를 설정할 수 있다. 

설정 파일에 export 명령어를 사용하여 환경변수를 정의하면, 새로운 쉘 세션이 시작될 때마다 해당 파일들이 읽히고 환경변수가 설정된다. 따라서 시스템을 재부팅하거나 새로운 터미널을 열어도 설정된 환경변수들이 유지된다.

 

예를 들어, 특정 디렉토리를 모든 사용자의 PATH 환경변수에 영구적으로 추가하려면, /etc/profile 파일이나 /etc/bash.bashrc 파일에 다음과 같은 줄을 추가하고 저장해야 한다.

export PATH="$PATH:/opt/my_program/bin"

수정 후에는 변경 사항을 적용하기 위해 현재 쉘을 다시 시작하거나 해당 설정 파일을 직접 source 해야 한다. 예를 들어, bash를 사용하는 경우 source ~/.bashrc 명령어를 실행하면 현재 세션에 변경된 설정이 적용된다.

 

요약하면, export 명령어는 현재 터미널 세션 및 그 자식 프로세스에 환경변수를 전달하는 역할을 하며, 영구적인 전역 설정을 위해서는 쉘 설정 파일을 수정해야 한다.

 

[쉘 스크립트에서 환경변수 활용 방법]

프로세스는 부모 프로세스의 환경변수를 복사해서 가진다.  예를 들어 리눅스 쉘 스크립트를 작성할 때 parent.sh 쉘 스크립트 내부에서 child.sh를 호출하는 경우, parent.sh는 하나의 독립적인 프로세스로 실행되고, child.sh는 parent.sh 프로세스의 자식 프로세스로 새롭게 생성되어 실행된다.

  • parent.sh: 실행되면 하나의 독립적인 프로세스를 생성한다.  child.sh를 실행하는 명령어를 만나면, 새로운 자식 프로세스를 생성하고 child.sh의 실행을 시작한다. 이 시점에서 parent.sh 프로세스는 일반적으로 child.sh 프로세스가 종료될 때까지 기다리거나 (foreground 실행), 아니면 백그라운드로 실행되어 child.sh의 종료와 관계없이 자신의 작업을 계속 수행할 수 있다.
  • child.sh: parent.sh 프로세스에 의해 생성된 자식 프로세스로 실행된다. child.sh 프로세스는 parent.sh 프로세스의 환경변수를 복사받아 초기 실행 환경을 구성하며, 독립적인 프로세스 ID(PID)를 할당받고 자신만의 메모리 공간에서 실행된다. child.sh의 실행 결과나 환경변수의 변경은 원칙적으로 부모 프로세스인 parent.sh 프로세스에 직접적인 영향을 주지 않는다. 
#!/bin/bash

# 부모 프로세스에서 MY_VARIABLE이라는 환경변수를 설정하고 값을 할당
export MY_VARIABLE="parent_value"

echo "부모 프로세스 (PID: $$) - MY_VARIABLE: $MY_VARIABLE"

# 자식 프로세스를 실행하는 스크립트 호출
./child.sh

 

parent.sh 에서 에서 MY_VARIABLE 을 설정하고 export 하면 자식프로세스인 child.sh 에서도 해당 환경변수를 사용할 수 있다.

#!/bin/bash

echo "자식 프로세스 (PID: $$) - MY_VARIABLE: $MY_VARIABLE"

# 자식 프로세스에서 MY_VARIABLE의 값을 변경 
export MY_VARIABLE="child_value"
echo "자식 프로세스 (PID: $$) - 변경된 MY_VARIABLE: $MY_VARIABLE"

 

 

 

References

https://coding-chobo.tistory.com/72

https://veneas.tistory.com/entry/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95

https://blog.naver.com/PostView.nhn?blogId=sdrock&logNo=221508545540