realpath
realpath는 path를 정규화하고 symbolic link를 해석해 canonical path를 출력하는 command-line 도구다.
Summary
.,.., 중복 slash를 정리하고 기본적으로 symbolic link를 실제 대상 path로 해석한다.- absolute path뿐 아니라 특정 기준 directory에 대한 relative path도 출력할 수 있다.
- 존재해야 하는 path component의 범위는
-e,-E,-m으로 선택한다.
Installation
Debian / Ubuntu
realpath는 GNU coreutils package에 포함된다.
sudo apt update sudo apt install coreutils
RHEL / Fedora
sudo dnf install coreutils
macOS
GNU 구현이 필요하면 Homebrew의 coreutils formula를 설치한다. GNU command를 일반 이름으로 실행하려면 formula의 gnubin directory를 PATH 앞에 둔다.
brew install coreutils export PATH="$(brew --prefix)/opt/coreutils/libexec/gnubin:$PATH" realpath --version
Windows
GNU Coreutils가 공식 제공하는 native WinGet package는 없다. WSL을 사용하는 경우 해당 Linux distribution의 package manager로 coreutils를 설치한다. PowerShell에서는 목적에 따라 Resolve-Path를 사용할 수 있지만, 존재하지 않는 path와 symbolic link 처리 semantics가 GNU realpath와 같다고 가정하지 않는다.
설치 확인
realpath --version
Usage
realpath [OPTION]... FILE...
realpath [OPTION]… FILE…- 기본 GNU 동작에서는 마지막 component를 제외한 path가 존재해야 한다.
- 여러
FILE을 주면 입력 순서대로 각 결과를 출력한다.
Options
존재 조건
-E, –canonicalize: 마지막 component가 없어도 실패하지 않는다. 최신 POSIX와의 명시적 동작 선택에 유용하며 오래된 GNU coreutils에는 없을 수 있다.-e, –canonicalize-existing: 모든 path component가 실제로 존재해야 한다.-m, –canonicalize-missing: 존재하지 않거나 접근할 수 없는 component도 directory처럼 취급해 문자열 path를 정규화한다.
symbolic link 해석
-P, –physical: symbolic link를 만나는 즉시 해석한 뒤 이후..을 처리한다. GNU 기본값이다.-L, –logical:..component를 먼저 처리한 뒤 symbolic link를 해석한다.-s, –strip, –no-symlinks: symbolic link를 해석하지 않고.,.., 중복 slash만 정리한다.
출력 형식
–relative-to=DIR: 결과를DIR기준 relative path로 출력한다.–relative-base=DIR: 결과가DIR아래에 있을 때만 relative path로 출력하고 나머지는 absolute path로 출력한다.-z, –zero: 각 결과를 newline 대신 NUL byte로 끝낸다.-q, –quiet: 지정한 file에 관한 진단 메시지를 숨긴다. exit status는 그대로 확인한다.
Examples
현재 위치 기준 absolute path
realpath -- ./docs/../README.md
–는 뒤의 값이 hyphen으로 시작해도 option으로 해석되지 않게 한다.
존재하는 path만 허용
realpath -e -- /etc/hosts
입력 또는 중간 component가 없으면 non-zero exit status로 실패한다.
아직 없는 path 정규화
realpath -m -- ./build/missing/../result.txt
-m은 path 존재 여부 검증이 아니라 정규화가 목적일 때 사용한다. 출력되었다고 file이 존재하거나 안전한 대상이라는 뜻은 아니다.
기준 directory에 대한 relative path
realpath --relative-to=/usr -- /usr/bin
위 명령은 bin을 출력한다.
filename 목록을 NUL로 구분
realpath -z -- ./one './two with spaces' | xargs -0 -n1 printf 'resolved: %s\n'
Troubleshooting
No such file or directory
기본 동작이나 -e에서 필요한 component가 없을 수 있다. 모든 component가 반드시 존재해야 하는지 확인하고, 단순히 future path를 정규화하려는 경우에만 -m을 사용한다.
Permission denied
상위 directory를 탐색할 execute permission이 없으면 canonicalization이 실패할 수 있다. -q로 message를 숨기더라도 exit status는 검사한다.
if resolved=$(realpath -e -- "$target"); then printf '%s\n' "$resolved" else printf 'cannot resolve target\n' >&2 fi
-L과 -P 결과가 다름
symbolic link와 ..이 같은 path에 있으면 처리 순서 때문에 결과가 달라질 수 있다. filesystem의 실제 위치가 목적이면 기본 -P, 논리적인 path component 처리가 목적이면 -L을 명시한다.
Compatibility
- POSIX.1-2024는
realpath와-E,-e를 정의한다. GNU 구현은-L,-P,-m, relative 출력, NUL 출력 등 확장 option을 추가로 제공한다. - 오래된 GNU coreutils는
-E를 지원하지 않을 수 있다. 배포 대상의realpath –help를 확인한다. - GNU, BSD, BusyBox 구현은 option과 기본 존재 조건이 다를 수 있으므로 portable script에서는 필요한 mode를 명시하고 대상 platform에서 검증한다.
- canonical path 확인만으로 접근 권한이나 안전성이 보장되지는 않는다. 보안 경계를 검사할 때는 path prefix 문자열 비교만 사용하지 말고 race condition과 mount, link 변경도 고려한다.
Help
See Also
History
- codex:: 2026-08-17 realpath의 설치, canonicalization mode, symbolic link 처리, relative 출력, 호환성 문서를 추가했다.