왜 기본 터미널에서 벗어나야 하는가 — 세 도구의 역할
macOS에 내장된 zsh도 zsh이긴 하다. 하지만 아무 설정 없이 쓰는 zsh와, 플러그인·프롬프트가 갖춰진 zsh의 체감 차이는 크다. 이전 명령을 회색으로 미리 보여주는 자동완성, 잘못된 명령을 빨간색으로 표시해주는 문법 하이라이팅, 현재 git 브랜치·언어 버전·실행 시간을 한 줄로 압축해 보여주는 프롬프트 — 이 세 가지가 들어오면 같은 작업을 30~50% 적은 키 입력으로 끝낼 수 있다.
세 도구의 역할은 명확히 분리된다. Zsh는 셸 본체다. Oh My Zsh는 그 위에서 돌아가는 프레임워크로, 플러그인 매니저와 테마 시스템을 한 번에 제공해 .zshrc의 복잡도를 추상화한다. Starship은 Rust로 작성된 크로스셸 프롬프트 렌더러로, Oh My Zsh의 기본 테마 자리만 대체하면서 압도적으로 빠른 렌더링과 풍부한 모듈을 제공한다. 즉 셸 → 프레임워크 → 프롬프트 레이어의 3층 구조이며, Starship을 쓰면 Oh My Zsh의 테마 부분만 무력화하고 나머지(플러그인·alias 관리)는 그대로 활용한다.
조합의 우선순위에 의견이 있다. 처음 세팅한다면 Oh My Zsh + Starship이 정답이다. 순수 zsh + zinit 같은 경량 매니저는 빠르지만 학습 비용이 크고, Oh My Zsh 단독은 프롬프트 커스터마이징이 toml 한 파일로 끝나는 Starship의 편의를 따라가지 못한다.
사전 준비 — Homebrew와 Zsh 5.9 확인·설치
먼저 현재 셸과 버전을 확인한다.
echo $SHELL # /bin/zsh 라면 macOS 기본 zsh
zsh --version # 5.9 (x86_64-apple-darwin...) 확인
macOS Sonoma 이후 기본 zsh는 5.9에 가깝지만 Apple이 자체 빌드한 버전이라 패치 주기가 느리다. Zsh 공식 다운로드에 올라온 최신 stable은 5.9(2022년 5월 릴리스)이고, 2026년 5월 기준 Homebrew도 동일하게 5.9를 제공하므로 Homebrew로 다시 설치해 패치 라인을 맞추는 편이 안전하다.
# Homebrew가 없다면 먼저 설치
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install zsh
echo "$(brew --prefix)/bin/zsh" | sudo tee -a /etc/shells
chsh -s "$(brew --prefix)/bin/zsh"
/etc/shells 등록 단계를 건너뛰면 chsh가 거부한다. 설정 후 터미널을 완전히 종료하고 다시 열어 echo $SHELL이 /opt/homebrew/bin/zsh(Apple Silicon) 또는 /usr/local/bin/zsh(Intel)을 가리키는지 확인한다.
마지막으로 Nerd Fonts를 미리 깔아둔다. Starship의 git·언어 아이콘이 □로 깨지는 사고는 거의 다 폰트 문제다.
brew install --cask font-jetbrains-mono-nerd-font
설치 후 터미널 앱(iTerm2 또는 macOS Terminal, Warp) 환경설정에서 폰트를 “JetBrainsMono Nerd Font”로 지정해야 적용된다.
Oh My Zsh 설치와 핵심 플러그인 설정
공식 설치는 한 줄이다.
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
설치 직후 ~/.zshrc가 새 템플릿으로 교체되고 기존 파일은 .zshrc.pre-oh-my-zsh로 백업된다. 핵심 변수는 세 개다 — ZSH(설치 경로), ZSH_THEME(나중에 빈 문자열로 비울 것), plugins(활성 플러그인 배열).
서드파티 두 개는 사실상 필수다.
git clone https://github.com/zsh-users/zsh-autosuggestions \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
~/.zshrc를 열어 plugins 배열을 다음처럼 수정한다.
plugins=(
git
z
web-search
copypath
zsh-autosuggestions
zsh-syntax-highlighting
)
내장 플러그인 중 즉시 효과가 큰 것은 git(수십 개 git alias 자동 추가), z(자주 가는 디렉토리에 부분 매칭으로 점프), copypath(현재 경로 클립보드 복사), web-search(google rust async 같은 형태로 검색)다. syntax-highlighting은 plugins 배열의 마지막에 와야 정상 동작한다.
자동 업데이트는 일주일 주기가 무난하다.
zstyle ':omz:update' mode auto
zstyle ':omz:update' frequency 7
Starship 설치와 starship.toml 커스터마이징
Starship 최신 안정 버전은 v1.25.1(2026년 4월 30일 출시)이다. v1.25.0에서 Maven 모듈 지원, starship statusline 서브커맨드, git 상태 추적 강화, Python venv 이름 처리 개선 등 주요 기능이 추가됐다(Starship 릴리스 노트).
Homebrew 설치가 가장 간단하다.
brew install starship
starship --version # starship 1.25.1 확인
이어서 ~/.zshrc의 ZSH_THEME="robbyrussell" 줄을 빈 문자열(ZSH_THEME="")로 바꾼 뒤, 파일 맨 아래에 다음 한 줄을 추가한다.
eval "$(starship init zsh)"
Oh My Zsh 테마와 Starship을 동시에 활성화하면 프롬프트가 두 번 그려지므로 반드시 테마를 비워야 한다.
설정은 ~/.config/starship.toml 한 파일에서 끝난다. 디렉토리가 없다면 mkdir -p ~/.config로 만든다. 가장 빠른 출발점은 공식 프리셋이다.
starship preset pastel-powerline -o ~/.config/starship.toml
# 또는: tokyo-night, gruvbox-rainbow, nerd-font-symbols 등
이후 모듈별로 끄고 켠다. 예시:
add_newline = true
format = "$directory$git_branch$git_status$python$nodejs$cmd_duration$line_break$character"
[directory]
truncation_length = 3
truncate_to_repo = true
[git_status]
ahead = "↑${count}"
behind = "↓${count}"
modified = "!"
[cmd_duration]
min_time = 2_000 # 2초 넘는 명령만 실행시간 표시
v1.25 계열의 starship statusline 서브커맨드는 tmux나 Zellij의 status bar에 Starship 모듈을 그대로 꽂아 쓸 때 유용하다. Python venv 이름 처리 개선은 poetry/uv 환경에서 잘못된 venv 라벨이 나오던 문제를 해결한다.
alias와 .zshrc 최적화로 반복 작업 자동화
alias는 적게, 자주 쓰는 것만. 너무 많으면 본인이 외우지 못한다.
# 이동
alias ..='cd ..'
alias ...='cd ../..'
alias ll='ls -alhG'
# git (oh-my-zsh git 플러그인이 이미 제공하는 것은 제외)
alias gst='git status -sb'
alias gco='git checkout'
alias glog='git log --oneline --graph --decorate -20'
# 도구
alias k='kubectl'
alias dc='docker compose'
alias serve='python3 -m http.server 8000'
복잡한 워크플로는 함수로 묶는다.
# 디렉토리 만들고 바로 이동
mkcd() { mkdir -p "$1" && cd "$1"; }
# 현재 디렉토리에서 fzf로 파일 찾아 vim으로 열기
vf() { vim "$(fzf --preview 'bat --color=always {}')"; }
# git 브랜치 정리 — merged된 로컬 브랜치 삭제
gclean() { git branch --merged main | grep -v 'main\|master' | xargs -n 1 git branch -d; }
환경 변수와 PATH는 .zshenv에, 인터랙티브 셸 전용 설정(alias·플러그인·프롬프트)은 .zshrc에 둔다. 이 분리를 지키면 VSCode나 cron이 비인터랙티브로 셸을 호출할 때 PATH가 안 잡히는 사고가 사라진다.
설정 변경 후 source ~/.zshrc로 즉시 적용되지만, chsh로 셸 자체를 바꿨거나 compinit 캐시 갱신이 필요한 경우는 터미널을 재시작해야 깨끗하다.
키보드 단축키와 터미널 alias를 함께 익히면 효과가 배가된다 — macOS 환경에서 자주 쓰는 단축키 모음을 곁들이면 마우스 사용 자체가 줄어든다.
자주 겪는 문제와 주의사항
보안 패치는 미루지 말 것. Starship은 CVE-2024-41815(셸 인젝션, custom commands의 예측 불가 셸 확장)로 인해 v1.0.0~v1.19.0이 영향을 받고 v1.20.0(2024년 7월 26일)에서 패치됐다. v1.20 미만을 쓰고 있다면 즉시 brew upgrade starship. 이번 가이드대로 v1.25.1을 새로 설치했다면 해당 없다.
아이콘이 □·?로 깨진다. 99%는 터미널 폰트가 Nerd Fonts가 아닌 경우다. iTerm2 → Preferences → Profiles → Text → Font에서 “JetBrainsMono Nerd Font”를 선택하고, “Use a different font for non-ASCII text” 체크박스도 같은 폰트로 설정한다.
터미널 시작이 느려졌다. 체감상 500ms 넘으면 손봐야 한다. 진단 순서는 정해져 있다.
# .zshrc 맨 위에
zmodload zsh/zprof
# 맨 아래에
zprof
새 터미널을 열면 어떤 플러그인이 시간을 잡아먹는지 표가 뜬다. Oh My Zsh 자체의 startup이 무거운 게 보이면 zinit이나 antidote 같은 lazy-load 매니저로 갈아탈 시점이다. 다만 갈아타기 전에 plugins 배열부터 줄여보는 걸 권한다 — 대부분 5~6개로 충분하다.
Oh My Zsh 업데이트가 내 설정을 덮어쓴다. custom 파일을 ~/.oh-my-zsh/custom/ 안에 두면 업데이트 영향을 받지 않는다. *.zsh 확장자 파일은 자동 로드되므로 custom/aliases.zsh, custom/functions.zsh로 분리해두면 .zshrc도 깔끔해진다.
런처와 결합하면 터미널 의존도를 더 줄일 수 있다 — Raycast로 워크플로 자동화와 함께 쓰면 명령 실행 자체가 줄어든다.
자주 묻는 질문
Q. Oh My Zsh 대신 zinit이나 antidote를 써야 할까?
처음이라면 Oh My Zsh가 정답이다. 문서·튜토리얼·Stack Overflow 답변량이 압도적이고, 트러블슈팅 비용이 가장 낮다. 터미널 시작 시간이 800ms를 넘기 시작하고, 그 원인이 Oh My Zsh의 lib 로딩이라는 게 zprof로 확인되면 그때 zinit으로 옮기는 순서를 권한다. 처음부터 zinit으로 시작하면 설정 syntax(zinit ice wait lucid 같은) 학습에 며칠 단위가 들어간다.
Q. Starship과 Powerlevel10k 중 뭐가 낫나?
p10k는 zsh 전용으로 instant prompt 같은 zsh 깊이 파고드는 최적화가 있어 시작 속도는 가장 빠르다. Starship은 zsh·bash·fish·PowerShell·nushell까지 한 toml로 통일되고, 모듈 추가·수정이 toml 편집 한 번으로 끝난다. 여러 셸을 오가거나 dotfiles를 git으로 관리한다면 Starship, zsh만 쓰고 0.1초도 아쉬우면 p10k.
Q. macOS 기본 zsh 그대로 쓰고 Oh My Zsh만 깔면 안 되나?
된다. 실제로 잘 동작한다. 다만 Apple이 패치를 자체 일정으로 내보내기 때문에 보안 픽스 반영이 늦을 수 있고, compinit 관련 잔잔한 버그를 만났을 때 업스트림과 버전이 어긋나 디버깅이 꼬인다. Homebrew zsh로 통일해두는 편이 장기적으로 손이 덜 간다.
Q. Nerd Fonts 없이 Starship을 쓸 수 있나?
starship.toml에서 모든 모듈의 symbol을 ASCII로 바꾸면 가능하다. [git_branch] symbol = "git:" 식으로. 다만 시각적 압축률이 크게 떨어져서 권하지 않는다. 폰트 설치 5분이 훨씬 남는 투자다.
단계별 실행 가이드
1단계. Homebrew zsh 5.9로 통일하고 기본 셸 전환
brew install zsh → /etc/shells 등록 → chsh -s "$(brew --prefix)/bin/zsh". 터미널 완전 재시작 후 echo $SHELL이 Homebrew 경로를 가리키는지 확인한다. 이 단계가 끝나야 이후 모든 설정의 기준점이 일정해진다.
2단계. Nerd Fonts 설치와 터미널 폰트 지정
brew install --cask font-jetbrains-mono-nerd-font로 폰트를 설치하고 사용 중인 터미널 앱(iTerm2/Warp/macOS Terminal) 환경설정에서 폰트를 변경한다. 순서를 뒤로 미루면 Starship 적용 직후 깨진 아이콘을 보고 헤매게 된다.
3단계. Oh My Zsh + 자동완성·하이라이팅 플러그인 설치
공식 curl 스크립트로 Oh My Zsh를 설치한 뒤 zsh-autosuggestions와 zsh-syntax-highlighting을 ${ZSH_CUSTOM}/plugins에 git clone한다. .zshrc의 plugins 배열에 추가하되 syntax-highlighting은 항상 마지막. source ~/.zshrc로 적용해 회색 자동완성이 뜨는지 검증한다.
4단계. Starship v1.25.1 설치와 toml 초기 설정
brew install starship으로 설치, .zshrc의 ZSH_THEME=""로 비우고 마지막 줄에 eval "$(starship init zsh)" 추가. mkdir -p ~/.config && starship preset pastel-powerline -o ~/.config/starship.toml로 출발점을 잡고, 이후 directory truncation·git_status·cmd_duration 모듈만 본인 취향으로 손본다.
5단계. alias·함수 정리 후 .zshrc 분할
자주 쓰는 alias 10개 내외와 mkcd 같은 함수 두세 개를 ~/.oh-my-zsh/custom/aliases.zsh, custom/functions.zsh로 분리한다. PATH·환경 변수는 .zshenv로 옮긴다. 마지막으로 zmodload zsh/zprof + zprof로 시작 시간을 한 번 측정해 200~400ms 범위인지 확인하고, 넘는다면 plugins 배열부터 줄인다.