목차

, , , , ,

realpath

realpath는 path를 정규화하고 symbolic link를 해석해 canonical path를 출력하는 command-line 도구다.

Summary

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...

Options

존재 조건

출력 형식

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

Help

realpath --help (GNU coreutils 8.30)

See Also

History