Linux 및 MacOS에서 링크를 읽는 옵션(심볼릭 링크가 아닌 경우 파일 경로를 반환함)

Linux 및 MacOS에서 링크를 읽는 옵션(심볼릭 링크가 아닌 경우 파일 경로를 반환함)

나는 이것을 가지고있다:

file_path="/actual/file/path"
read_link="$(readlink "$file_path")"  # just in case it's a symlink

readlink가 심볼릭 링크가 아닌 경우 빈 문자열을 에코합니까? 심볼릭 링크가 아닌 경우 원래 경로를 에코하는 readlink 옵션이 있습니까?

답변1

GNU/Linux 시스템의 경우 -f플래그는 readlink( --canonicalize)입니다. «지정된 이름을 가진 모든 구성 요소의 모든 심볼릭 링크를 반복적으로 추적하여 정규화합니다.» 당신을 위해 그것을 해줄 것입니다:

touch /tmp/real
ln -s /tmp/real /tmp/link

readlink -f /tmp/real    # → "/tmp/real"
readlink -f /tmp/link    # → "/tmp/real"

Mac OSX 시스템의 경우 이를 수행할 수 있는 옵션이 없습니다. «주어진 인수가 심볼릭 링크가 아니면 readlink아무 것도 인쇄되지 않고 오류와 함께 종료됩니다.».

readlink두 시스템 모두 문서와 사용 가능한 모든 옵션을 찾을 수 있습니다 man readlink.

OSX에서 범용 솔루션에 가장 근접하게 접근할 수 있는 기능은 다음과 같습니다.

readlinkorreal() { readlink "$1" || echo "$1"; }

readlinkorreal /tmp/real    # → "/tmp/real"
readlinkorreal /tmp/link    # → "/tmp/real"

답변2

다음과 같은 파일 구조를 고려하면:

test/
├── link -> no-link
└── no-link

-m옵션이 효과가 있는 것 같습니다.

florin@debian:/tmp/test$ readlink -m link 
/tmp/test/no-link
florin@debian:/tmp/test$ readlink -m no-link 
/tmp/test/no-link

답변3

readlink -f@roaima의 답변에서 언급한 대로 이렇게 하세요.

macOS 12.3에는추가된 지원이 옵션의 경우 이제 Linux 및 macOS에서 사용할 수 있습니다.

관련 정보