동작하는 코드
예제 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 하나만 신경 쓰면 됩니다.
echo $HOME,echo $USER,echo $SHELL로 기본 환경 변수를 확인하세요.export MYPROJECT="/tmp/test"로 변수를 설정하고echo $MYPROJECT로 확인하세요.alias ll='ls -la'로 alias를 만들고 사용해보세요.alias를 입력해 현재 설정된 모든 alias 목록을 확인하세요.~/.zshrc(또는~/.bashrc)에 자주 쓰는 alias 3개를 추가하고source로 적용하세요.
Q1. 환경 변수를 현재 셸뿐 아니라 자식 프로세스(npm, python 등)에서도 사용하려면?
- A)
set VARNAME=value - B)
export VARNAME=value - C)
env VARNAME=value - D)
declare VARNAME=value