DaleSchool

환경 변수와 설정

입문25분

학습 목표

  • 환경 변수와 로컬 변수의 차이를 설명할 수 있다
  • PATH 변수의 역할을 이해하고 수정할 수 있다
  • alias와 함수로 자주 쓰는 명령어를 단축할 수 있다
  • 셸 설정 파일(.zshrc)을 편집하여 영구 설정을 적용할 수 있다

동작하는 코드

예제 1: 환경 변수 확인하기

echo $HOME

출력 예시:

/Users/dale
echo $USER

출력:

dale
echo $PATH

출력 예시:

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

PATH: (콜론)으로 구분된 디렉토리 목록입니다.

예제 2: 변수 설정하기

# 로컬 변수 (현재 셸에서만 유효)
MY_NAME="홍길동"
echo $MY_NAME

출력:

홍길동
# 환경 변수 (자식 프로세스에도 전달)
export MY_NAME="홍길동"
echo $MY_NAME

환경 변수로 export하면 이 셸에서 실행하는 다른 프로그램에서도 읽을 수 있습니다.

예제 3: 모든 환경 변수 보기

env

출력 (일부):

HOME=/Users/dale
USER=dale
SHELL=/bin/zsh
PATH=/usr/local/bin:/usr/bin:/bin
LANG=ko_KR.UTF-8
...

env | grep PATH처럼 파이프로 필터링해서 볼 수 있습니다.

직접 수정하기

로컬 변수 vs 환경 변수

# 로컬 변수: 현재 셸에서만
MY_VAR="hello"
bash -c 'echo $MY_VAR'   # 자식 bash에서는 비어있음

출력:

                          ← 빈 줄 (자식 셸에서 접근 불가)
# 환경 변수: 자식 프로세스에도 전달
export MY_VAR="hello"
bash -c 'echo $MY_VAR'

출력:

hello

핵심 차이: export 없이 만든 변수는 현재 셸에서만 유효합니다.

PATH에 디렉토리 추가

# 현재 PATH 확인
echo $PATH

# 새 경로를 맨 앞에 추가 (우선순위 높음)
export PATH="/새/설치/경로:$PATH"

# 확인
echo $PATH

새 도구를 설치했는데 "command not found"가 뜨면 설치 경로를 PATH에 추가하면 됩니다.

alias: 긴 명령어 단축하기

# alias 만들기
alias ll='ls -la'
alias gs='git status'
alias ..='cd ..'
alias ...='cd ../..'

# 사용
ll
gs
# 현재 설정된 alias 목록
alias

# 특정 alias 해제
unalias ll

실무에서 유용한 alias 모음:

# 자주 이동하는 디렉토리
alias proj='cd ~/projects'
alias docs='cd ~/Documents'

# git 단축
alias gs='git status'
alias ga='git add .'
alias gc='git commit -m'
alias gp='git push'
alias gl='git log --oneline'

# ls 개선
alias ll='ls -la'
alias la='ls -a'
alias lt='ls -lth'    # 최근 수정 순 정렬

# 안전한 rm
alias rm='rm -i'      # 항상 확인 요청

셸 설정 파일에 영구 저장

terminal을 닫으면 만든 alias와 export가 사라집니다. 영구적으로 유지하려면 셸 설정 파일에 추가합니다:

# zsh 사용자 (~/.zshrc)
nano ~/.zshrc

# bash 사용자 (~/.bashrc)
nano ~/.bashrc

파일 맨 아래에 추가:

# 환경 변수
export PROJECTS="$HOME/projects"

# alias
alias ll='ls -la'
alias gs='git status'
alias ..='cd ..'

# 함수
mkcd() {
  mkdir -p "$1" && cd "$1"
}

저장 후 적용:

source ~/.zshrc

이제 터미널을 새로 열어도 설정이 유지됩니다.

"왜?" — PATH가 중요한 이유

PATH는 명령어를 찾는 디렉토리 목록입니다. node를 입력하면 셸은 PATH의 디렉토리를 순서대로 검색합니다:

/usr/local/bin → 없음
/usr/bin → 없음
/bin → 있음! → 실행

명령어를 찾지 못하면:

zsh: command not found: node

이때 which node로 node가 어디 설치됐는지 확인하고, 그 경로를 PATH에 추가합니다.

함수: 더 복잡한 로직 처리

alias보다 복잡한 경우에는 함수를 씁니다:

# 디렉토리 만들면서 이동
mkcd() {
  mkdir -p "$1" && cd "$1"
}

# 사용
mkcd new-project/src
# 파일을 백업하면서 편집
backup_edit() {
  cp "$1" "$1.bak" && nano "$1"
}

# 인자 접근
greet() {
  echo "안녕하세요, $1님!"   # $1 = 첫 번째 인자
  echo "오늘도 좋은 하루 되세요."
}
greet "홍길동"

흔한 실수

실수 1: alias에 공백 주의

# 잘못됨 (= 주변 공백)
alias ll = 'ls -la'

# 올바름
alias ll='ls -la'

실수 2: source 잊기

# .zshrc 수정 후 반드시 적용
source ~/.zshrc   # 또는 . ~/.zshrc

# 또는 터미널을 새로 열기

source 없이는 새 설정이 현재 터미널에 적용되지 않습니다.

실수 3: export 없이 자식 프로세스에 전달하려 할 때

# 이건 현재 셸에서만 유효
MYVAR="hello"
npm start   # npm이 MYVAR을 못 읽음

# 이건 npm도 읽을 수 있음
export MYVAR="hello"
npm start

실수 4: .env 파일을 git에 커밋

# .env 파일에는 API 키, 비밀번호 등 민감 정보
DATABASE_URL=postgresql://...
API_KEY=sk-...

# 절대 git에 커밋하지 마세요!
# .gitignore에 반드시 추가
echo ".env" >> .gitignore

심화 학습

.env 파일과 개발 환경 변수

개발에서 API 키, DB 비밀번호 등을 .env 파일에 저장합니다:

# .env 파일
DATABASE_URL=postgresql://localhost/mydb
API_KEY=secret123
NODE_ENV=development

불러오기:

source .env
echo $DATABASE_URL

대부분의 프레임워크(Node.js, Python 등)는 자동으로 .env를 읽습니다. .env는 항상 .gitignore에 추가하세요.

which와 type으로 명령어 위치 확인
# 명령어가 어디에 있는지
which node
# /usr/local/bin/node

which python3
# /usr/bin/python3

# alias인지 함수인지 확인
type ll
# ll is an alias for ls -la

type mkcd
# mkcd is a shell function

여러 버전이 설치된 경우 어떤 게 실행되는지 확인할 수 있습니다.

셸 설정 파일의 종류

| 파일 | 언제 실행 | |------|----------| | ~/.zshrc | zsh 대화형 셸 시작 시 | | ~/.bashrc | bash 대화형 셸 시작 시 | | ~/.zshenv | 모든 zsh 셸 (스크립트 포함) | | ~/.bash_profile | bash 로그인 셸 시작 시 |

macOS에서 zsh를 쓴다면 ~/.zshrc 하나만 신경 쓰면 됩니다.

  1. echo $HOME, echo $USER, echo $SHELL로 기본 환경 변수를 확인하세요.
  2. export MYPROJECT="/tmp/test"로 변수를 설정하고 echo $MYPROJECT로 확인하세요.
  3. alias ll='ls -la'로 alias를 만들고 사용해보세요.
  4. alias를 입력해 현재 설정된 모든 alias 목록을 확인하세요.
  5. ~/.zshrc (또는 ~/.bashrc)에 자주 쓰는 alias 3개를 추가하고 source로 적용하세요.

Q1. 환경 변수를 현재 셸뿐 아니라 자식 프로세스(npm, python 등)에서도 사용하려면?

  • A) set VARNAME=value
  • B) export VARNAME=value
  • C) env VARNAME=value
  • D) declare VARNAME=value