pwd는 지금 서 있는 디렉터리를 출력한다. cd는 그 위치를 옮긴다. 경로를 다루는 basename, dirname, realpath도 여기에 둔다.

pwd

Bash
pwd
pwd -L
pwd -P

`-L`은 논리 경로다. 심볼릭 링크로 들어왔으면 그 링크 경로를 보여 준다. 기본값이 이쪽이다. `-P`는 링크를 풀어서 실제 디렉터리를 보여 준다.

pwd가 가리키는 곳은 이 셸의 작업 디렉터리다. 스크립트 안에서 cd한 결과는 그 스크립트가 끝나면 부모 셸에 남지 않는다. 셸이 자식 프로세스에게 위치를 물려줄 수는 있지만, 자식이 바꾼 위치를 부모가 돌려받지는 못한다.

cd

Bash
cd /var/log
cd ..
cd -
cd
cd ~
cd ~/src

`/var/log`처럼 `/`로 시작하면 절대 경로다. `../logs`처럼 시작하면 현재 디렉터리 기준의 상대 경로다.

`..`는 부모 디렉터리, `.`는 현재 디렉터리다. 인자 없는 `cd`와 `cd ~`는 홈 디렉터리(`HOME`)로 간다. `cd ~사용자`는 그 사용자의 홈으로 간다. `cd -`는 바로 이전에 있던 디렉터리로 돌아간다. 이 값은 `OLDPWD`에 들어 있다.

디렉터리에 실행 권한이 없으면 cd는 실패한다. 읽기 권한은 목록을 보는 권한이고, 들어가는 권한은 실행 권한이다. chmod 글에서 다시 다룬다.

`CDPATH`가 설정되어 있으면 상대 경로 cd가 현재 디렉터리 말고 그 목록도 뒤진다. 예상과 다른 곳으로 이동하면 `echo "$CDPATH"`로 확인한다. 비어 있는 것이 일상적인 상태다.

디렉터리 스택

pushd는 가기 전에 현재 위치를 스택에 쌓고 이동한다. popd는 스택에서 꺼내 그곳으로 돌아온다. dirs는 스택을 보여 준다.

Bash
pushd /tmp
popd
dirs -v

짧은 왕복에는 `cd -`로 충분하다. 세 곳 이상을 오가면 스택이 편하다.

경로에서 이름만 자르기

Bash
basename /var/log/syslog
dirname /var/log/syslog
realpath ./notes.txt

basename은 마지막 조각 `syslog`만, dirname은 그 앞의 `/var/log`를 출력한다. 둘 다 파일이 실제로 있는지 확인하지 않고 문자열만 자른다.

realpath는 상대 경로와 `.`, `..`, 심볼릭 링크를 풀어 절대 경로로 보여 준다. 대상이 있어야 한다. 아직 없는 경로의 문자열만 정리하려면 `realpath -m`을 쓴다.