Mac에서 zsh와 oh-my-zsh 사용하기

2019년 8월 17일 토요일 / , ,
简体中文한국어
요약 ·
Mac의 기본 bash를 버리고 zsh와 oh-my-zsh로 터미널 경험을 최적화합니다.

Mac의 터미널은 기본적으로 bash를 사용하지만, bash의 경험은 다소 투박합니다. 자동 완성은 파일명만 되고, 명령을 잘못 입력해도 Enter를 눌러야만 알 수 있습니다. 좋은 터미널 경험을 얻으려면 역시 zsh로 전환해야 합니다. zsh 자체가 bash보다 훨씬 강력하고, 여기에 oh-my-zsh라는 설정 프레임워크를 더하면 자동 완성, 제안, 하이라이트 같은 기능을 바로 사용할 수 있습니다.

기본값 확인

먼저 현재 셸과 시스템에서 사용할 수 있는 셸이 무엇인지 확인합니다.

Shell
echo $SHELL
# /bin/bash

cat /etc/shells

/etc/shells 에 나열된 것은 시스템에서 로그인 셸로 허용하는 프로그램입니다. 보면 실제로 이미 /bin/zsh 가 있습니다. 다만 이는 시스템에 내장된 것으로 버전이 오래되었기 때문에 보통 Homebrew로 새 버전의 zsh를 따로 설치하는 것을 권장합니다.

zsh 설치

Homebrew가 아직 설치되어 있지 않다면 먼저 설치해야 합니다.

Shell
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

그다음 zsh를 설치합니다.

Shell
brew install zsh
zsh --version

Homebrew로 설치한 zsh는 /usr/local/bin/zsh에 있지만, 이 경로는 /etc/shells 에 없기 때문에 이 상태에서 바로 chsh 를 실행하면 거부되고, 올바른 셸이 아니라는 안내가 나옵니다. 따라서 먼저 이를 목록에 추가한 다음 기본 셸을 전환해야 합니다.

Shell
# 把 Homebrew 的 zsh 加进允许的 shell 列表
echo /usr/local/bin/zsh | sudo tee -a /etc/shells

# 切换默认 shell
chsh -s /usr/local/bin/zsh

전환한 뒤에는 터미널을 완전히 종료했다가 다시 열고, 그다음 echo $SHELL 로 확인해 보세요. /usr/local/bin/zsh 로 바뀌었다면 성공입니다.

처음 zsh에 들어가면 아직 ~/.zshrc가 없기 때문에 설정 마법사가 뜨면서 어떻게 설정할지 묻습니다. 여기서는 그냥 q 를 눌러 종료하면 됩니다. 이어서 oh-my-zsh가 설정 파일을 하나 생성해 줄 것이기 때문입니다.

oh-my-zsh 설치

zsh 자체의 기본 설정은 매우 소박해서 거의 아무것도 없기 때문에 대부분은 설정 프레임워크를 하나 더 설치합니다. 가장 흔한 것이 oh-my-zsh입니다. 테마, 플러그인, 자동 완성 같은 것들을 모두 묶어 두었기 때문에 설치 후 거의 바로 사용할 수 있습니다.

공식 원클릭 설치 명령이 제공됩니다:

Shell
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

스크립트는 oh-my-zsh를 ~/.oh-my-zsh에 복제하고, 기존에 ~/.zshrc가 있으면 먼저 ~/.zshrc.pre-oh-my-zsh로 백업한 다음 자체 템플릿으로 바꿉니다.

설치가 끝나면 터미널 모양이 즉시 바뀝니다. 프롬프트는 화살표와 현재 디렉터리 이름으로 바뀌고, git 저장소에서는 현재 브랜치도 표시됩니다. 커밋하지 않은 변경 사항이 있으면 뒤에 작은 X 표시가 하나 더 붙습니다.

테마

테마는 ~/.zshrc 에 있는 ZSH_THEME 로 결정되며 기본값은 robbyrussell.

Shell
ZSH_THEME="robbyrussell"

oh-my-zsh에는 많은 테마가 기본 포함되어 있으며, 모두 ~/.oh-my-zsh/themes 에 있습니다. 또한 Oh My Zsh 테마 에서 타사 테마를 확인할 수 있습니다.

플러그인

oh-my-zsh에서 가장 유용한 부분은 역시 플러그인입니다. 플러그인도 ~/.zshrc 에서 설정하며, plugins 배열에 적으면 됩니다.

Shell
plugins=(git z zsh-autosuggestions zsh-syntax-highlighting)

그중 git 과 z 는 기본 포함되어 있고, 나머지 두 개는 타사 플러그인이므로 먼저 oh-my-zsh의 custom 디렉터리에 클론해야 합니다.

Shell
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

그다음 source ~/.zshrc 를 실행하거나 터미널을 다시 열면 적용됩니다.

git

git 플러그인은 다양한 단축 명령을 제공합니다. 자주 쓰는 몇 개만 외워도 git 명령을 입력할 때 수고를 크게 덜 수 있습니다.

Shell
gst     # git status
gaa     # git add --all
gcmsg   # git commit -m
gco     # git checkout
gl      # git pull
gp      # git push
glog    # git log --oneline --decorate --graph

전체를 보고 싶다면 바로 alias | grep git.

z

z 는 방문했던 디렉터리를 기억한 뒤 접근 빈도와 시간에 따라 정렬합니다. 그래서 한 번만 가 본 곳이라면 이후 디렉터리 이름의 일부만 입력해도 바로 이동할 수 있습니다.

Shell
z blog     # 跳到最常去的、路径里带 blog 的目录

며칠 사용해 보니 저는 이제 긴 경로를 거의 직접 입력하지 않게 되었습니다.

zsh-autosuggestions

이 플러그인은 기록을 바탕으로 입력하는 동안 가능한 명령을 회색 글자로 뒤에 보여 주며, 오른쪽 방향키를 누르면 바로 받아들일 수 있습니다. 많은 긴 명령도 앞 몇 글자만 입력하면 나머지가 저절로 나타납니다.

zsh-syntax-highlighting

입력 중인 명령에 색을 입혀 주며, 존재하는 명령은 초록색, 잘못 입력했거나 존재하지 않는 명령은 빨간색으로 표시합니다. 따라서 Enter를 누르기 전에도 철자가 틀렸는지 알 수 있습니다.

또한 이 플러그인은 plugins 에서 마지막에 두어야 합니다. 다른 플러그인이 정의한 위젯을 감싸야 하기 때문입니다. 앞에 두면 나중에 로드되는 플러그인의 명령이 하이라이트되지 않을 수 있습니다.

bash 설정 옮겨 오기

원래 ~/.bash_profile 에 작성해 둔 것들, 예를 들어 일부 PATH 와 별칭은 zsh가 읽지 않으므로 직접 ~/.zshrc 로 옮겨야 합니다. 저는 source $ZSH/oh-my-zsh.sh 다음 줄에 두는 것을 권장합니다. 그래야 직접 정의한 별칭이 플러그인의 같은 이름 별칭을 덮어쓸 수 있습니다.

Shell
source $ZSH/oh-my-zsh.sh

# User configuration
export PATH="$HOME/bin:$PATH"
export EDITOR="vim"

alias ll="ls -lah"

또한 bash와 zsh의 문법은 대부분 호환되므로 평소 쓰는 명령은 거의 바꿀 필요가 없습니다. 일부만 다릅니다. 예를 들어 zsh에서는 일치하는 대상이 없는 와일드카드가 bash처럼 그대로 전달되지 않고 바로 오류를 냅니다. 따라서 no matches found 가 나오면 인자에 따옴표를 붙이면 됩니다.

업데이트

oh-my-zsh는 기본적으로 정기적으로 업데이트를 확인하며, 시기가 되면 터미널을 열 때 업데이트할지 묻습니다. Enter를 누르면 됩니다. 수동으로 업데이트하려면 아래 명령을 직접 실행하면 됩니다.

Shell
upgrade_oh_my_zsh

zsh 자체는 Homebrew와 함께 업데이트되므로 brew upgrade 할 때 최신 버전으로 올라갑니다.

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...