리눅스 환경 변수와 PATH 설정 방법 (export, .bashrc, /etc/environment)
터미널에서는 잘 되던 명령이 crontab이나 서비스에서는 “command not found”를 낸다면, 원인은 대부분 환경 변수다. 이 글에서는 리눅스 환경 변수 확인 방법과 export, PATH 설정, .bashrc와 /etc/environment 같은 설정 파일의 차이까지 정리한다. 자바 설치 후 JAVA_HOME을 잡는 방법은 자바 JDK 환경 변수 설정에 따로 있다.

리눅스 환경 변수 확인하기
# 전체 환경 변수 보기
env
printenv
# 특정 변수 보기
echo $HOME
echo $PATH
printenv LANG| 변수 | 뜻 |
|---|---|
PATH | 명령어를 찾는 디렉터리 목록(콜론으로 구분) |
HOME | 현재 사용자의 홈 디렉터리 |
USER | 현재 사용자 이름 |
SHELL | 로그인 셸 경로 |
LANG | 언어와 문자셋(ko_KR.UTF-8 등) |
TZ | 시간대(설정한 경우) |
셸 변수와 환경 변수 차이: export
그냥 변수를 만들면 현재 셸 안에서만 쓰인다. export를 붙여야 그 셸에서 실행하는 프로그램(자식 프로세스)에도 전달되는 환경 변수가 된다.
APP_ENV=dev
bash -c 'echo "자식: $APP_ENV"' # 비어 있음
export APP_ENV=dev
bash -c 'echo "자식: $APP_ENV"' # dev
# 지우기
unset APP_ENV쉘 스크립트 안의 변수 사용법은 리눅스 쉘 스크립트 기초에 정리해 두었다.
PATH 설정 방법
PATH는 명령어를 찾을 디렉터리를 앞에서부터 차례로 적은 목록이다. 새 디렉터리를 추가할 때는 기존 값을 꼭 함께 써야 한다. PATH=/opt/app/bin처럼 덮어쓰면 ls 같은 기본 명령까지 찾지 못하게 된다.
# 뒤에 추가 (기존 명령 우선)
export PATH="$PATH:/opt/app/bin"
# 앞에 추가 (새 경로 우선)
export PATH="/opt/app/bin:$PATH"
# 명령어가 실제로 어디서 실행되는지 확인
command -v python3
type -a python3리눅스 환경 변수 영구 설정 파일
export는 현재 터미널을 닫으면 사라진다. 계속 쓰려면 설정 파일에 적어야 하는데, 파일마다 읽히는 시점과 범위가 다르다.
| 파일 | 적용 범위 | 읽히는 시점 |
|---|---|---|
~/.bashrc | 해당 사용자 | 대화형 셸을 열 때 |
~/.profile, ~/.bash_profile | 해당 사용자 | 로그인할 때 |
/etc/profile.d/*.sh | 모든 사용자 | 로그인할 때 |
/etc/environment | 모든 사용자 | 로그인 세션 시작 시(스크립트가 아닌 KEY=값 형식) |
# 내 계정에만: ~/.bashrc 끝에 추가
echo 'export PATH="$PATH:$HOME/bin"' >> ~/.bashrc
source ~/.bashrc
# 모든 사용자에게: /etc/profile.d 에 파일 만들기
echo 'export APP_HOME=/opt/app' | sudo tee /etc/profile.d/app.sh/etc/environment 작성 주의
/etc/environment는 셸 스크립트가 아니라 단순한 “이름=값” 목록이다. export를 쓰거나 $PATH 같은 변수를 넣으면 풀리지 않는다. 변수 확장이 필요하면 /etc/profile.d를 쓰자.
리눅스 환경 변수 적용 안될 때
- crontab: 아주 짧은 PATH로 실행되고 .bashrc를 읽지 않는다. 절대 경로를 쓰거나 crontab 맨 위에 PATH를 적는다. 자세한 내용은 리눅스 crontab 사용법에 있다.
- systemd 서비스: .bashrc나 /etc/profile을 읽지 않는다. 서비스 파일에 Environment= 또는 EnvironmentFile=로 지정한다. 서비스 관리는 systemctl 사용법 글을 보자.
- sudo: 보안 때문에 환경 변수 대부분을 지우고 정해진 PATH(secure_path)를 쓴다. 꼭 필요한 경우에만 sudo -E로 넘긴다.
# systemd 서비스에 환경 변수 넣기
[Service]
Environment="APP_ENV=prod"
EnvironmentFile=/etc/app/app.env환경 변수 전반에 대한 더 자세한 설명은 Arch Wiki 환경 변수 문서가 잘 정리되어 있다.
systemd 서비스에 환경 변수를 넣는 전체 예시는 systemd 서비스 만들기 글의 unit 파일 예제를 참고하자.
마무리
환경 변수는 “어디서 실행되느냐”에 따라 보이는 값이 달라진다는 점만 기억하면 대부분의 문제를 풀 수 있다. 터미널, crontab, 서비스, sudo가 각각 다른 환경을 쓴다는 것을 알고, 경로는 가능한 절대 경로로 적는 습관을 들이자.
첫 댓글을 남겨보세요