realpath는 path를 정규화하고 symbolic link를 해석해 canonical path를 출력하는 command-line 도구다.
., .., 중복 slash를 정리하고 기본적으로 symbolic link를 실제 대상 path로 해석한다.-e, -E, -m으로 선택한다.
realpath는 GNU coreutils package에 포함된다.
sudo apt update sudo apt install coreutils
sudo dnf install coreutils
GNU 구현이 필요하면 Homebrew의 coreutils formula를 설치한다. GNU command를 일반 이름으로 실행하려면 formula의 gnubin directory를 PATH 앞에 둔다.
brew install coreutils export PATH="$(brew --prefix)/opt/coreutils/libexec/gnubin:$PATH" realpath --version
GNU Coreutils가 공식 제공하는 native WinGet package는 없다. WSL을 사용하는 경우 해당 Linux distribution의 package manager로 coreutils를 설치한다. PowerShell에서는 목적에 따라 Resolve-Path를 사용할 수 있지만, 존재하지 않는 path와 symbolic link 처리 semantics가 GNU realpath와 같다고 가정하지 않는다.
realpath --version
realpath [OPTION]... FILE...
realpath [OPTION]… FILE…FILE을 주면 입력 순서대로 각 결과를 출력한다.-E, –canonicalize: 마지막 component가 없어도 실패하지 않는다. 최신 POSIX와의 명시적 동작 선택에 유용하며 오래된 GNU coreutils에는 없을 수 있다.-e, –canonicalize-existing: 모든 path component가 실제로 존재해야 한다.-m, –canonicalize-missing: 존재하지 않거나 접근할 수 없는 component도 directory처럼 취급해 문자열 path를 정규화한다.-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는 그대로 확인한다.realpath -- ./docs/../README.md
–는 뒤의 값이 hyphen으로 시작해도 option으로 해석되지 않게 한다.
realpath -e -- /etc/hosts
입력 또는 중간 component가 없으면 non-zero exit status로 실패한다.
realpath -m -- ./build/missing/../result.txt
-m은 path 존재 여부 검증이 아니라 정규화가 목적일 때 사용한다. 출력되었다고 file이 존재하거나 안전한 대상이라는 뜻은 아니다.
realpath --relative-to=/usr -- /usr/bin
위 명령은 bin을 출력한다.
realpath -z -- ./one './two with spaces' | xargs -0 -n1 printf 'resolved: %s\n'
기본 동작이나 -e에서 필요한 component가 없을 수 있다. 모든 component가 반드시 존재해야 하는지 확인하고, 단순히 future path를 정규화하려는 경우에만 -m을 사용한다.
상위 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
symbolic link와 ..이 같은 path에 있으면 처리 순서 때문에 결과가 달라질 수 있다. filesystem의 실제 위치가 목적이면 기본 -P, 논리적인 path component 처리가 목적이면 -L을 명시한다.
realpath와 -E, -e를 정의한다. GNU 구현은 -L, -P, -m, relative 출력, NUL 출력 등 확장 option을 추가로 제공한다.-E를 지원하지 않을 수 있다. 배포 대상의 realpath –help를 확인한다.