Linux / 명령어 / realpath - 절대 경로와 실제 경로 확인
realpath는 상대 경로, .과 .., 중복 슬래시와 심볼릭 링크를 처리하여 정규화된 경로를 출력하는 명령입니다. 파일의 실제 위치를 확인하거나, 두 경로가 어떤 위치로 해석되는지 비교하거나, 기준 디렉터리에 대한 상대 경로를 만들 때 유용합니다.
경로 구성 요소가 반드시 존재해야 하는지는 -e, -E, -m에 따라 달라집니다. 또한 경로 계산 결과만으로 파일을 안전하게 열었다고 볼 수는 없으므로 보안 검증에는 별도의 주의가 필요합니다.
realpath 명령어란?
realpath는 파일명이나 디렉터리 경로를 정규화하여 출력합니다. 일반적인 결과는 절대 경로이며 불필요한 /, ., .. 구성 요소와 심볼릭 링크가 처리됩니다.
realpath ./docs/../images/logo.webp
현재 작업 디렉터리가 /home/user/project라면 다음과 같은 결과가 나올 수 있습니다.
/home/user/project/images/logo.webp
정확한 결과는 현재 작업 디렉터리, 실제 디렉터리 구조와 심볼릭 링크 구성에 따라 달라집니다.
기본 문법과 사용법
realpath [옵션] 파일 ...
여러 경로를 지정하면 각각의 처리 결과를 한 줄씩 출력합니다.
realpath . realpath ../logs/app.log realpath /var//log/./nginx/../syslog
현재 디렉터리의 물리적 경로만 필요하다면 pwd -P가 더 직접적입니다. realpath는 현재 위치뿐 아니라 지정한 여러 경로를 처리할 수 있습니다.
경로 존재 조건 선택하기
GNU realpath에서는 경로가 어느 범위까지 실제로 존재해야 하는지 옵션으로 선택할 수 있습니다.
| 옵션 | 존재 조건 |
|---|---|
-E, --canonicalize |
마지막 구성 요소가 없어도 허용합니다. GNU의 기본 동작이지만 이식성을 위해 명시할 수 있습니다. |
-e, --canonicalize-existing |
마지막 항목을 포함한 모든 경로 구성 요소가 실제로 존재해야 합니다. |
-m, --canonicalize-missing |
중간 구성 요소가 없어도 디렉터리라고 가정하여 문자열을 정규화합니다. |
-e로 존재하는 경로만 허용하기
realpath -e /etc/passwd realpath --canonicalize-existing /srv/app/config.yml
구성 요소 하나라도 없거나 접근할 수 없으면 실패합니다. 실제로 존재하는 대상만 후속 작업에 넘기고 싶을 때 유용하지만 검사 직후 대상이 바뀌는 상황까지 막아주지는 않습니다.
-E로 마지막 이름이 없어도 처리하기
realpath -E /srv/uploads/new-file.txt
상위 경로는 확인할 수 있지만 마지막 파일은 아직 생성하지 않은 상황에 사용할 수 있습니다. GNU에서는 기본 동작이지만 POSIX 환경의 차이를 줄이려면 의도를 옵션으로 나타내는 편이 좋습니다.
-m으로 존재하지 않는 중간 경로까지 계산하기
realpath -m /srv/not-created/../future/file.txt
-m은 파일 시스템에 없는 구성 요소를 디렉터리처럼 취급합니다. 경로 문자열을 미리 계산할 때 유용하지만 출력 경로가 실제로 존재하거나 생성 가능한지는 보장하지 않습니다.
심볼릭 링크와 -L, -P, -s
..과 심볼릭 링크가 함께 있는 경로는 처리 순서에 따라 다른 위치가 될 수 있습니다.
| 옵션 | 동작 |
|---|---|
-P, --physical |
심볼릭 링크를 만날 때 해석한 뒤 이후의 ..을 처리합니다. GNU의 기본 모드입니다. |
-L, --logical |
경로 문자열의 ..을 논리적으로 처리한 뒤 심볼릭 링크를 해석합니다. |
-s, --strip, --no-symlinks |
심볼릭 링크를 따라가지 않고 점 구성 요소와 중복 슬래시만 정리합니다. |
물리적 경로 확인하기
realpath -P /srv/current/../shared
/srv/current가 다른 위치를 가리키는 링크라면 먼저 그 대상을 해석한 뒤 부모 경로를 계산합니다.
심볼릭 링크를 보존해 문자열만 정리하기
realpath -s -m /srv/current/../shared
-s와 -m을 함께 사용하면 실제 파일 시스템의 링크를 따라가지 않고 경로 문자열 자체를 정리할 수 있습니다. 실제 대상 위치가 필요할 때는 이 조합을 사용하면 안 됩니다.
상대 경로 출력하기
--relative-to로 기준 디렉터리 지정하기
처리한 경로를 특정 디렉터리에 대한 상대 경로로 출력할 수 있습니다.
realpath --relative-to=/srv/www /srv/www/assets/css/site.css
출력은 다음과 같습니다.
assets/css/site.css
--relative-base로 하위 경로만 상대화하기
대상이 기준 디렉터리 아래에 있을 때만 상대 경로로 출력하고, 외부에 있으면 절대 경로를 유지할 수 있습니다.
realpath --relative-base=/srv/www /srv/www/index.html /var/log/syslog
첫 번째 경로는 상대 경로가 되고 두 번째 경로는 기준 밖에 있으므로 절대 경로로 출력됩니다.
readlink -f와 realpath의 차이
| 비교 항목 | realpath |
readlink -f |
|---|---|---|
| 주요 목적 | 파일명의 정규화와 상대 경로 변환 | 심볼릭 링크 대상 출력에서 확장된 정규화 기능 |
| 상대 출력 | --relative-to와 --relative-base 지원 |
일반적으로 절대 정규 경로 출력 |
| 권장 사용 | 경로 정규화에는 GNU 문서가 realpath를 권장 |
링크에 저장된 대상 문자열 확인이 기본 목적 |
| 이식성 | 옵션과 기본 존재 조건의 구현 차이를 확인해야 함 | -f는 모든 Unix 구현에서 동일하다고 가정할 수 없음 |
셸 스크립트에서 활용하기
설정 파일의 실제 경로 기록하기
config=$(realpath -e -- "$1") || {
printf '%s\n' '설정 파일 경로를 확인할 수 없습니다.' >&2
exit 1
}
printf '설정 파일: %s\n' "$config"
-e를 사용해 모든 구성 요소가 존재하는지 확인하지만, 이후 사용 시점까지 파일이 그대로라는 보장은 없습니다.
여러 파일명을 안전하게 구분하기
-z 또는 --zero는 각 결과 끝에 줄바꿈 대신 NUL 문자를 출력합니다.
realpath -z -- file1 "file with space"
파일명에 줄바꿈이 포함될 수 있는 자동화에서 유용하며, 결과를 받는 프로그램도 NUL 구분 입력을 지원해야 합니다.
경로 검증에 사용할 때 주의할 점
정규화와 접근 허가는 다르다
정규화된 경로가 특정 디렉터리 아래에 보인다고 해서 읽기나 쓰기 권한이 자동으로 허용되는 것은 아닙니다. 소유권, 권한, ACL과 보안 정책을 별도로 확인해야 합니다.
검사와 사용 사이에 대상이 바뀔 수 있다
realpath로 확인한 뒤 파일을 여는 사이에 심볼릭 링크나 디렉터리가 바뀌면 다른 대상을 사용하게 될 수 있습니다. 보안 경계에서는 단순 문자열 비교에만 의존하지 말고 운영체제가 제공하는 안전한 파일 열기 방식과 권한 분리를 사용하세요.
접두어 문자열 비교를 조심한다
/srv/www-safe도 문자열상 /srv/www로 시작합니다. 기준 경로 포함 여부를 검사할 때는 디렉터리 경계까지 고려해야 하며, 경로 정규화 하나만으로 안전한 샌드박스가 만들어지지 않습니다.
주요 옵션 정리
| 옵션 | 설명 |
|---|---|
-E, --canonicalize |
마지막 구성 요소가 없어도 경로를 정규화합니다. |
-e, --canonicalize-existing |
모든 구성 요소가 실제로 존재해야 성공합니다. |
-m, --canonicalize-missing |
존재하지 않는 구성 요소도 디렉터리처럼 처리합니다. |
-L, --logical |
..을 논리적으로 처리한 뒤 심볼릭 링크를 해석합니다. |
-P, --physical |
심볼릭 링크를 먼저 해석하는 물리적 모드이며 GNU의 기본값입니다. |
-s, --no-symlinks |
심볼릭 링크를 해석하지 않고 경로 문자열을 정리합니다. |
--relative-to=디렉터리 |
지정한 디렉터리를 기준으로 상대 경로를 출력합니다. |
--relative-base=디렉터리 |
기준 아래의 경로만 상대 경로로 출력합니다. |
-q, --quiet |
지정한 경로에 관한 진단 메시지를 억제합니다. |
-z, --zero |
결과를 NUL 문자로 구분합니다. |
FAQ
realpath는 존재하지 않는 파일에도 사용할 수 있나요?
GNU 기본 동작 또는 -E에서는 마지막 구성 요소가 없어도 처리할 수 있습니다. 중간 구성 요소까지 없을 수 있다면 -m, 모든 구성 요소의 존재를 요구하려면 -e를 사용합니다.
realpath는 항상 심볼릭 링크를 해석하나요?
기본 물리적 모드에서는 심볼릭 링크를 해석합니다. 링크를 따라가지 않고 경로 문자열만 정리하려면 -s 또는 --no-symlinks를 사용합니다.
pwd -P와 realpath .의 차이는 무엇인가요?
둘 다 현재 위치의 물리적 절대 경로를 보여줄 수 있습니다. pwd -P는 현재 작업 디렉터리에 특화되어 있고, realpath는 임의의 여러 경로와 존재 조건, 상대 경로 출력 옵션을 제공합니다.
realpath 결과만 확인하면 경로 탐색 공격을 막을 수 있나요?
아닙니다. 검사와 파일 사용 사이에 경로가 바뀔 수 있고 권한 문제도 별개입니다. 신뢰 경계에서는 안전한 파일 열기 API, 권한 분리와 디렉터리 경계 검사를 함께 사용해야 합니다.









