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

macOS가 왜 zsh를 기본으로 삼았나

~15 min · zsh, macOS, default-shell, license

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

Apple이 기본 셸을 바꾼 데는 라이선스 배경이 있어

Bash 4.0은 2009년에 GPLv3로 출시됐어. Apple은 특허 조항과 사용 제한을 금지하는 의무(anti-tivoization)를 운영체제 공급자 관점에서 부담으로 봤어. 그래서 macOS의 시스템 bash는 GPLv2로 배포된 마지막 버전인 3.2 계열에 십 년 넘게 머물렀고, 2019년에는 이미 12년 된 bash였지. macOS Catalina부터는 기본 로그인 셸을 허용 범위가 넓은 자체 라이선스의 zsh로 바꿨어.

bash 3.2 대비 zsh가 주는 것

  • 자동 완성 엔진은 compinit과 커뮤니티의 자동 완성 정의를 사용해. git 뒤에서 Tab을 누르면 브랜치가, kubectl 뒤에서는 pod가 후보로 보여.
  • 재귀 글로브 확장은 **/*.py로 현재 디렉터리 아래의 모든 Python 파일을 찾을 수 있어서 단순한 경우에는 find가 필요 없어.
  • 글로브 한정자는 *(.om[1])처럼 파일 종류와 정렬 조건을 글로브에 붙여 가장 최근에 수정된 일반 파일을 바로 고를 수 있어.
  • 테마를 적용한 프롬프트는 Powerlevel10k, Starship이나 Pure를 쓰면 Git 브랜치, Python 가상 환경과 Kubernetes 맥락을 프롬프트에 표시할 수 있어.
  • 플러그인 생태계에서는 Oh My Zsh, Prezto나 zinit을 통해 자동 제안, 구문 강조와 명령 기록 검색을 선택해서 붙일 수 있어.

bash에서 그대로 가져온 것

대화형 bash에서 익힌 $(...), [[ ]], $?, $0, 히어독, set -e와 배열은 zsh에서도 대부분 그대로 쓸 수 있어. 차이는 단어 분리, 글로브 동작, read 옵션과 배열 인덱스의 시작점에서 나타나. zsh 배열은 기본적으로 1부터 시작하며 자세한 내용은 스크립팅 트랙에서 다뤄.

스크립트는 zsh? bash?

내 컴퓨터에서만 실행하는 스크립트라면 zsh를 선택해도 돼. 서버, 컨테이너, CI 실행기나 다른 개발자의 컴퓨터에서도 돌려야 한다면 대상 환경에 실제로 있는 bash 또는 POSIX sh를 선택해야 해. 어떤 셸이든 shebang과 본문 문법이 일치해야 해.

Code

재귀 글로브: 모든 Python 파일 찾기·zsh
# 현재 경로 아래의 모든 .py 파일
ls **/*.py
# zsh 글로브 한정자로 가장 큰 .py 파일 5개
ls -lh -- **/*.py(.OL[1,5])
git, kubectl, brew의 Tab 자동 완성·zsh
# 세션마다 compinit을 한 번 불러오기
autoload -Uz compinit && compinit
# Tab으로 브랜치 이름 완성
git checkout <Tab>
# 현재 Kubernetes 맥락의 pod 이름 완성
kubectl logs <Tab>

External links

Exercise

현재 셸이 bash라면 먼저 echo $SHELLps -p $$로 로그인 셸과 실행 중인 셸을 구분해. zsh로 바꾸기로 했다면 chsh -s /bin/zsh를 실행하고, .zshrcautoload -Uz compinit && compinit을 추가해. 새 터미널에서 git checkout 뒤 Tab을 눌러 브랜치 완성이 나타나는지 확인하고, 문제가 있을 때만 compinit -d로 캐시를 다시 만들어.

Progress

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

댓글 4

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

    실행중인 셸이 무엇인지 ECHO $SHELL을 써서 확인하라는 것이군요. 또한 맥 OS 에서는 ZSH가 도입되었으니 그의 문법을 배워라

    💛 by 피파warm
    1. 피파
      피파· warmEErik Choi

      맞아요. 다만 명령은 대문자 ECHO가 아니라 소문자 echo $SHELL이에요. 그리고 macOS Catalina 이후 새 계정의 기본 셸이 zsh라서, 먼저 실제 셸을 확인한 다음 그 셸의 문법과 시작 파일을 배우면 됩니다.

  2. 맹지영 (수퍼맹)
    맹지영 (수퍼맹)

    고마워 피파. 알려준데로 wsl로 깔아서 테스트 중이야^^ 깔고 처음부터 막혀서 AI의 도움을 받아서 테스트 성공했어. 초딩때 DOS시절 생각도나고 약간의 재미를 느껴서 너무 기뻐 ㅎㅎ. 덕분이야 피파.

    💛 by 피파happy
    1. 피파
      피파· happy맹지영 (수퍼맹)맹지영 (수퍼맹)

      수퍼맹님, 첫 막힘을 AI와 함께 직접 뚫고 테스트까지 성공하셨다니 저도 기뻐요. 😊 DOS 시절 기억이 떠오르면서 재미까지 느끼셨다면, 벌써 터미널과 좋은 첫인사를 나누신 거예요. 막히지 않는 게 목표가 아니라 막혔을 때 하나씩 풀어내는 게 바로 이 퀘스트의 시작이거든요. 이제부터는 명령어가 조금씩 낯선 암호가 아니라 손에 익는 도구가 될 거예요. 첫 성공, 진짜 축하해요!