본문 바로가기
C.W.K.
Stream
Lesson 01 of 10 · published

환경 변수

~12 min · env, export, variables

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

모든 프로그램이 읽는 상태

환경 변수는 프로세스가 이름으로 읽는 키-값 데이터야. $HOME, $PATH, $USER$LANG 같은 값이 프로그램의 동작을 바꿔. printenv는 현재 환경을 나열하고, printenv VAR는 특정 변수 하나를 보여 줘.

값을 설정하고 자식에게 전달하거나 지우기

  • VAR=value는 현재 셸의 변수만 설정해.
  • export VAR=value는 이후에 시작하는 자식 프로세스에도 값을 전달해.
  • unset VAR는 현재 셸에서 변수를 지워.
  • VAR=value cmd는 해당 명령을 실행하는 동안에만 값을 전달해. HTTPS_PROXY=... curl ...가 대표적인 예야.

왜 export가 중요한가

export하지 않은 셸 변수는 자식 프로세스의 환경에 들어가지 않아. 따라서 python script.py로 실행한 프로그램이 os.environ['VAR']를 읽어야 한다면 먼저 그 변수를 내보내야 해.

자주 다루게 될 변수들

  • $PATH는 셸이 실행 파일을 찾을 디렉터리 순서를 정해.
  • $HOME은 현재 사용자의 홈 디렉터리를 가리켜.
  • $EDITORgit commit처럼 편집기가 필요한 명령이 실행할 프로그램을 정해. 터미널 편집기는 nvim처럼, GUI 편집기는 명령이 종료를 기다리도록 code -wcursor -w처럼 설정해.
  • $PAGERman 같은 명령이 긴 출력을 보여 줄 프로그램을 정해. less -R처럼 설정할 수 있어.
  • $LANG$LC_*는 로케일과 문자 집합 규칙을 정해.
  • $TERM은 터미널 기능의 종류를 알려 줘.

어디서 설정?

대화형 셸 설정은 보통 ~/.zshrc에 두고, 로그인할 때 필요한 환경 설정은 ~/.zprofile에 둬. 두 파일이 읽히는 정확한 순서는 다음 레슨에서 다뤄.

환경 변수는 자식에게 내려가는 복사본이야

프로세스가 export한 값은 이후에 만든 자식이 받지만 이미 실행 중인 부모나 형제에게 거꾸로 전파되지 않아. 새 터미널과 오래 떠 있던 앱의 값이 다른 이유를 이 방향성에서 찾아.

비밀을 넣는 통로와 저장하는 곳을 구분해

환경 변수는 프로세스 목록, 크래시 리포트, 디버그 로그, 자식 프로세스로 새어 나갈 수 있어. 토큰을 닷파일에 평문으로 박지 말고 자격 증명 저장소에서 실행 시점에 최소 범위로 주입해. 편리한 전달 방식이 곧 안전한 저장소는 아니야.

Code

확인 + 설정·bash
printenv | head
echo $EDITOR $PAGER $SHELL
# 현재 셸에만 설정
FOO=bar
echo $FOO
# 자식 프로세스에도 전달
export FOO=bar
python3 -c 'import os; print(os.environ.get("FOO"))'
명령 한 번만 환경 적용·bash
HTTPS_PROXY=http://proxy:8080 curl https://example.com
DEBUG=1 ./run.sh
# 현재 셸에는 값이 남지 않는지 확인
echo $DEBUG

External links

Exercise

printenv | head -20으로 현재 환경 일부를 읽고 export EDITOR=nvim처럼 실제 사용하는 편집기를 설정해. echo $EDITOR로 값을 확인한 뒤 새 bash 자식 셸에서도 같은 값이 전달되는지 보고, exit로 원래 셸에 돌아와.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.