251130: zsh: cd

발행: (2025년 11월 30일 오후 12:07 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

목표

This dive took 6.5 hours
이 탐구는 6.5시간이 걸렸습니다

이 문서의 목표는 다음 명령어들을 깊이 파고드는 것입니다:

cd /
cd -
cd
cd ..

대상 독자

Linux 명령줄 작업에 대한 기본적인 이해가 있고, 디렉터리 탐색 명령어에 대한 지식을 더욱 깊게 하고 싶은 사용자들을 위한 것입니다. 간단한 복사‑붙여넣기 예시를 포함합니다.

배경

CommandDescription
cd /루트 디렉터리로 이동
cd ..상위 디렉터리로 이동
cd 또는 cd ~홈 디렉터리로 이동
cd -이전 디렉터리로 이동 (‘뒤로 가기’ 버튼과 동일)

깊이 살펴보기

cd 명령어의 소스 코드를 어떻게 확인할 수 있나요?

type cd
# cd is a shell builtin

cd는 쉘(예: bash, zsh) 내부에 직접 구현되어 있습니다.

현재 사용 중인 쉘을 어떻게 알 수 있나요?

echo $SHELL   # /bin/zsh
# or
echo $0       # -zsh

버전을 빠르게 확인해 봅시다

zsh --version
# zsh 5.9 (arm64-apple-darwin24.0)

zsh에서 cdbin_cd 명령어 소스 코드를 파헤쳐 보기

공식 저장소는 https://github.com/zsh-users/zsh.
주요 함수:

  • cd_get_dest() – 초기 인자 처리
  • cd_do_chdir() – 실제 chdir() 호출 수행
  • cd_new_pwd() – 디렉터리 변경 성공 후 보조 처리

제한된 쉘 검사

if (isset(RESTRICTED)) {
    zwarnnam(nam, "restricted");
    return 1;
}

zwarnnam 은 경고 메시지를 포맷합니다. 제한 모드에서는 cd가 차단될 수 있습니다.

예시

zsh -r          # start a restricted shell
cd ..           # → zsh: cd: restricted

심볼릭 링크를 따라가는 cd

chasinglinks = OPT_ISSET(ops,'P') || (isset(CHASELINKS) && !OPT_ISSET(ops,'L'));

chasinglinks 가 true 가 되는 경우:

  • -P 옵션이 지정된 경우 또는
  • CHASELINKS 옵션이 활성화된 경우, 단 -L 로 오버라이드되지 않은 경우.

테스트 환경 설정

tmp_dir=$(date +%y%m%d_%H%M%S_test)
mkdir "$tmp_dir" && cd "$tmp_dir"
mkdir physical_path
ln -s physical_path symbolic_link

레이아웃 확인

ls -al
# total 0
# drwxr-xr-x   4 user staff 128 ... .
# drwxr-x---+ 73 user staff 2336 ... ..
# drwxr-xr-x   3 user staff  96 ... physical_path
# lrwxr-xr-x   1 user staff  13 ... symbolic_link -> physical_path

테스트

# Default (no -P, no CHASE_LINKS)
cd symbolic_link
pwd   # /path/to/tmp_dir/symbolic_link

# With -P (physical path)
cd ..
cd -P symbolic_link
pwd   # /path/to/tmp_dir/physical_path

# Enable CHASE_LINKS globally
cd ..
setopt CHASE_LINKS
cd symbolic_link
pwd   # /path/to/tmp_dir/physical_path

# Override with -L (logical path)
cd ..
cd -L symbolic_link
pwd   # /path/to/tmp_dir/symbolic_link

setopt

setopt 내장 명령은 Src/options.c 에 구현되어 있습니다.

쉘에 설정된 옵션을 어떻게 확인하나요?

/* With no arguments or options, display options. */
if (!*args) {
    scanhashtable(optiontab, 1, 0, OPT_ALIAS, optiontab->printnode, !isun);
    return 0;
}
setopt
# chaselinks
# combiningchars
# interactive
# …

아직 활성화되지 않은 옵션을 어떻게 확인하나요?

unsetopt
# noaliases
# aliasfuncdef
# allexport
# …

cd 실행 중 신호 처리

queue_signals();   /* block interrupt-like signals while changing directory */

신호를 차단하면 디렉터리 변경이라는 중요한 작업이 중단 없이 완료됩니다.

디렉터리 스택 처리

zpushnode(dirstack, ztrdup(pwd));

pwd 는 변경 전 현재 작업 디렉터리를 보관합니다. 디렉터리 스택은 다음과 같이 확인할 수 있습니다:

dirs -v
# 0   ~/Workspaces
# 1   ~/Workspaces/oss

cd_get_dest() 파헤치기

cd_get_dest()cd에 전달된 인자를 기반으로 목적 디렉터리를 결정합니다:

  • 인자 없음 → 홈 디렉터리($HOME) 반환
  • - → 디렉터리 스택(OLDPWD)에서 이전 디렉터리 반환
  • 특정 경로 → 옵션(-P/-L) 처리 후 제공된 경로 반환

오류가 발생하면 NULL 을 반환합니다(예: 이전 디렉터리가 설정되지 않은 경우).


문서 끝.

Back to Blog

관련 글

더 보기 »

디지털 마케팅 코스

!디지털 마케팅 코스 커버 이미지https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploa...