"realpath"와 "readlink -f"의 차이점은 무엇입니까

"realpath"와 "readlink -f"의 차이점은 무엇입니까

realpath나는 이 명령과 그것이 더 이상 사용되지 않고 readlink -f이제 권장 되는 방법에 대해 많이 읽었습니다  . 또한 readlink에 이러한 기능이 부족하여 realpath가 도입된 곳도 있으며, 일단 도입되면 realpath는 더 이상 필요하지 않으며 대부분의 운영 체제 공급업체에서는 이를 지원하지 않습니다.

readlink -f제가 질문을 한 이유는 저도 "매우 유사한" 명령으로 추천하는 사람들을 많이 보았는데 realpath, "매우 유사한" 부분에 대해 자세히 설명하는 사람이 없어서 그게 마음에 걸렸기 때문입니다. 실제 차이점은 무엇입니까?

답변1

주변에는 몇 가지 명령이 있습니다 realpath.

realpath유틸리티는 래퍼입니다.realpath라이브러리 기능은 여러 번 재창조되었습니다.이류.

데비안은 한때realpath팩(분리된~에서dwww~부터멍청한)는 2001년부터 패키징 및 문서화를 제외하고는 변경되지 않았으며 현재 단계적으로 폐지되고 있습니다. 현재 더 많은 표준 대안(GNU readlink및 곧 GNU ) 이 있으므로 이 유틸리티는 더 이상 사용되지 않지만 realpath당시에는 GNU 유틸리티가 readlink전혀 존재하지도 않았습니다. 이 구현은 realpath일부를 지원합니다.options기호 링크가 널 종료 출력을 확인하거나 생성하는 것을 방지합니다. 바쁜 상자자신의 것을 포함하여realpath명령(옵션 없음)

GNU 핵심 도구소개했다realpath명령 입력버전 8.152012년 1월. 이것은 BusyBox 및 Debian과 호환되는 대안이며 realpathGNU와 동일한 옵션이 많이 있습니다.readlink.

realpathreadlink -fGNU 와 동일한 효과가 있습니다 readlink. 이 두 명령(또는 realpath의 다양한 명령 readlink -f)의 차이점은 지원하는 추가 옵션입니다.

GNU는 realpath더 이상 사용되지 않습니다. 반대의 문제가 있습니다. GNU는 너무 새롭고 모든 곳에서 사용할 수 없습니다. 데비안은GNU 생략realpath그로부터coreutils짐을 싸서 스스로 붙잡으세요 realpath. 왜인지는 모르겠습니다. GNU는 realpath즉시 대체할 수 있어야 하기 때문입니다. 그러나 Debian jessie 및 Ubuntu 16.04부터는 realpathGNU가 사용됩니다.

현재 Linux 시스템에서 기호 링크가 포함될 수 있는 경로를 정규화하는 가장 좋은 옵션은 입니다 readlink -f.

BSD 시스템에는readlinkGNU와는 기능이 다른 명령입니다 readlink. 특히 BSD에는 readlink경로를 정규화하는 옵션이 없으며 전달된 심볼릭 링크만 통과합니다.

readlink그런데, 같은 문제 - 그것도 마찬가지야여러 번 발명됨(유닉스에 심볼릭 링크를 추가할 때 이 유틸리티가 추가되지 않은 것은 불행한 일입니다.) 이제 많은 호환되지 않는 플래그가 있는 여러 구현(특히 BSD 대 GNU)에서 안정화되었습니다.

답변2

너무 길어요. readlink -f0기존 디렉토리에 존재하지 않는 realpath파일을 반환합니다 1. 그러나 존재하지 않는 파일 readlink -e처럼 동작 realpath하고 반환합니다 (참조).1편집자 주마지막에).

readlink -f

$ readlink -f non-existent-file
/home/user/non-existent-file
$ echo $?
0

readlink -e

$ readlink -e non-existent-file
$ echo $?
1

realpath

$ realpath non-existent-file
non-existent-file: No such file or directory
$ echo $?
1

readlink -f디렉토리가 존재하지 않습니다

readlink -f경로의 어느 부분이 없는지에 따라 동작이 달라집니다.

$ readlink -f /tmp/non-existent-dir/foo
$ echo $?
1

realpath디렉토리가 존재하지 않습니다

$ realpath /tmp/non-existent-dir/foo
$ echo $?
1

유효성

readlink대부분의 Linux 배포판에 설치됩니다. 반면에 realpath다음과 같이 설치하는 것이 점점 일반화되고 있습니다.realpath참여했습니다GNU Coreutils(이전에는 별도의 패키지였습니다).

요컨대

통화를 교체하고 싶다면 realpath ...를 사용하세요 readlink -e ....
그러나 그 배포가 점점 더 널리 퍼지고 있으므로 realpath설치를 기대하는 것도 무리가 아닙니다.realpath

MMV readlink구현은 매우 다양합니다.
MMV realpath기본 Linux 설치의 가용성 비율 readlink.


시험용readlink(GNU coreutils) 8.21그리고실제 경로 버전 1.19우분투 16에서.


편집자 주

답변3

readlink -freadlink -e다른 응답에서 언급했듯이 또는 (배포판에 따라) 의 기능은 의 기능과 동일할 수 있습니다 realpath. 그러나 realpath이 유틸리티는 동일하지 않습니다 readlink. 예를 들어, readlink심볼릭 링크 파일의 내용(그 안에 있는 리터럴 텍스트)을 읽거나 검색하는 것이 가능합니다.

> ln -s "I am cold" slfile
> readlink slfile
I am cold

이것은 realpath할 수 없습니다.

결국 심볼릭 링크 파일은 디렉터리/파일 계층 내에서 이동하기 위한 "레시피"로 해석되는 텍스트 파일입니다. 하지만 여전히 텍스트 파일입니다. 예를 들어, 그 내용( readlink반환되는 것)은 조작될 수 있어야 합니다 sed -i '...' slfile. 실제로 옵션은 심볼릭 링크를 --follow-symlinks강제로 sed -i따르도록 하는 것입니다. 현재 설정(OpenSuSe 15.3 기본값, GNU sed 4.4, GNU bash 버전 4.4.23(1))에서 이 기능이 작동하지 않기 때문에 "should"라고 씁니다. sed -i해당 옵션이 없으면 --follow-symlinks여전히 파일을 심볼릭 링크하고 싶습니다 . 길.

관련 정보