경로를 기준점부터 쓸지 현재 위치부터 쓸지 정해
절대 경로는 파일 시스템의 뿌리인 /에서 시작해. /Users/me/projects/foo.txt처럼 쓰면 현재 작업 디렉터리가 어디든 같은 위치를 가리켜. 상대 경로는 현재 작업 디렉터리를 기준으로 해석돼. projects/foo.txt는 현재 위치 아래의 projects 디렉터리를 뜻하므로 cd 뒤에는 다른 대상을 가리킬 수 있어.
경로의 특수 표기를 읽어
.: 현재 디렉터리야...: 부모 디렉터리야.~: 현재 사용자의 홈 디렉터리로 셸이 확장해.~user: 해당 사용자 홈을 가리킬 수 있어.-:cd에서 직전 디렉터리를 뜻해.
cd ../../sibling-project처럼 조합할 수 있지만, 변경 작업 전에는 pwd로 기준점을 확인해.
움직이는 대상과 고정할 기준을 보고 선택해
프로젝트 내부의 문서와 링크는 저장소 전체가 이동해도 관계를 유지하도록 상대 경로가 적합할 수 있어. 서비스 선언, 백업 대상과 보안 정책은 기준점을 분명히 하기 위해 절대 경로가 필요할 수 있어. cron과 CI의 작업 디렉터리를 추측하지 말고 실행기가 제공하는 명시적 경로에서 출발해. shebang도 커널이 해석할 수 있는 실행 경로 계약이므로 단순한 현재 위치 표기와 구분해야 해.
문자열 경로와 실제 경로는 다를 수 있어
realpath path는 상대 요소와 심볼릭 링크를 해석한 경로를 보여 주는 데 도움을 줘. 최신 macOS에는 realpath가 포함되어 있지만, 이 명령이 없는 구형 macOS에서는 Homebrew의 coreutils로 GNU 구현을 설치할 수 있어. 설치하지 않고 BSD 도구만 써야 한다면 cd "$(dirname foo.txt)" && pwd -P처럼 대상의 디렉터리로 이동한 뒤 물리 경로를 출력하는 방법도 있어. GNU와 BSD 계열은 옵션과 존재하지 않는 경로 처리 방식이 다를 수 있으므로 현재 구현을 확인해. readlink와 파일 API도 목적에 따라 선택하고, 단순히 슬래시를 합치는 것만으로 심볼릭 링크와 마운트 경계를 알 수는 없다는 점을 기억해.
상대 경로는 구성 요소의 관계를 보존해
같이 이동하는 파일 둘의 관계를 표현할 때 상대 경로는 사용자 이름과 설치 위치를 박아 넣지 않아 재사용하기 좋아. 반대로 외부 디렉터리나 시스템 자원을 참조할 때는 어느 기준에서 해석되는지 문서로 남겨야 해. 짧아 보이는 표기보다 파일을 누가 이동시키고 실행 기준을 누가 소유하는지에 맞춰 선택해.
정규화는 권한과 신뢰 검사가 아니야
..를 접고 절대 경로 문자열을 만들었다고 해서 대상이 허용한 루트 안에 있다는 보장은 없어. 중간 심볼릭 링크가 밖으로 빠지거나 마운트가 다른 저장소를 연결할 수 있어. 신뢰할 수 없는 입력으로 경로를 만들 때는 파일 시스템이 해석한 실제 대상을 확인하고, 허용 루트와 권한 정책 안에 있는지 작업 직전에 검증해.