251130: zsh: cd
Source: Dev.to
목표
This dive took 6.5 hours
이 탐구는 6.5시간이 걸렸습니다
이 문서의 목표는 다음 명령어들을 깊이 파고드는 것입니다:
cd /
cd -
cd
cd ..
대상 독자
Linux 명령줄 작업에 대한 기본적인 이해가 있고, 디렉터리 탐색 명령어에 대한 지식을 더욱 깊게 하고 싶은 사용자들을 위한 것입니다. 간단한 복사‑붙여넣기 예시를 포함합니다.
배경
| Command | Description |
|---|---|
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에서 cd의 bin_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 을 반환합니다(예: 이전 디렉터리가 설정되지 않은 경우).
문서 끝.