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


68

나는 realpath명령 에 대해 많은 것을 읽었으며 readlink -f현재 권장되는 명령에서 더 이상 사용되지 않는 방법을 읽었습니다 . 또한 realpath가 도입 된 이유는 readlink에 그러한 기능이 없기 때문이며, 일단 도입되면 realpath가 더 이상 필요하지 않고 대부분의 OS 공급 업체가 지원을 중단 한 것으로 나타났습니다.

내 질문의 이유는 많은 사람들이 readlink -f"아주 비슷한"명령으로 추천 하는 것을 보았 realpath기 때문에 아무도 "아주 비슷한"부분을 설명하지 않기 때문에 나를 괴롭히는 것입니다. 실제 차이점은 무엇입니까?

답변:


73

몇 가지 realpath명령이 있습니다.

realpath유틸리티는 realpath라이브러리 함수를 감싸는 래퍼 이며 여러 다시 개발되었습니다 .

데비안은 유지 관리하는 데 사용 realpath(패키지 분리 에서 dwww이후 우디 2001 년부터 포장 및 문서에 관한 제외하고는 변경되지 않았습니다),하지만 지금은 폐지되었다. 더 많은 표준 대안 (GNU readlink및 곧 GNU realpath) 이 있기 때문에이 유틸리티는 더 이상 사용되지 않지만, GNU 유틸리티에는 전혀 없었 readlink습니다. 이 구현은 심볼릭 링크 확인을 방지하거나 널 종료 출력을 생성하기 위해 realpath몇 가지 options를 지원합니다 . BusyBox 에는 자체 realpath명령 도 포함되어 있습니다 (옵션 없음).

GNU coreutils 는 2012 년 1 월 버전 8.15realpath명령을 도입했습니다 . 이것은 BusyBox와 Debian의 호환되는 대체품 이며 GNU와 공통된 많은 옵션이 있습니다 .realpathreadlink

realpathreadlink -fGNU와 같은 효과가 있습니다 readlink. 두 명령 (또는 다양한 realpath명령 readlink -f)을 구별하는 것은 지원하는 추가 옵션입니다.

GNU realpath는 더 이상 사용되지 않습니다. 반대의 문제가있다 : 어느 곳에서나 사용하기에는 너무 새롭다. 데비안 은 패키지 에서 GNUrealpath생략coreutils 하고 자체적으로 고수했다 realpath. GNU realpath가 드롭 인 대체품이어야하기 때문에 이유를 모르겠습니다 . 그러나 데비안 제시와 우분투 16.04에서 GNU realpath가 사용됩니다.

Linux 시스템에서 현재 심볼릭 링크가 포함 된 경로를 정규화하는 것이 가장 좋습니다 readlink -f.

BSD 시스템에는 readlinkGNU와 다른 기능을 가진 명령 이 있습니다 readlink. 특히, BSD readlink에는 경로를 표준화 할 수있는 옵션이 없으며, 전달 된 심볼릭 링크 만 통과합니다.

readlink우연히도 같은 문제가있었습니다. 또한 여러 번 발명되었습니다 (유닉스에 심볼릭 링크를 추가 할 때이 유틸리티를 추가하지 않은 것은 유감스러운 생략이었습니다). 호환되지 않는 많은 플래그 (특히 BSD vs. GNU)로 여러 구현에서 안정화되었습니다.


8
readlink -fGNU 오래 전에 OpenBSD에있었습니다. NetBSD에, FreeBSD의 및 오픈 BSD 이제 모든이 readlink -f(당신의 링크가 심지어 그것을 언급). realpathFreeBSD와 IRIX에서 오랫동안 사용되어 왔습니다. (데비안에서 이전 버전인지는 모르겠습니다). HPUX 및 IRIX는이 readlink아니지만, -f. realpath데비안 실험 의 패키지는 이제 coreutils 의 패키지입니다 (실험이 중단되는지 확인하는 실험으로). dwww realpathreadlink -eGNU 와 비슷하게 작동 하지만 readlink -f완전한 드롭 인 대체 기능은 아닙니다
Stéphane Chazelas

2
realpath그 전에 2002 년부터 FreeBSD의되었습니다, pwd(2000 년 이후, 그 일을했다 pwd some-file부를 것 realpath()file). 데비안은 있었다 realpath나는 오픈 BSD는 추가 1998 년은 IRIX 6.5보다 다른 어떤 증거도 발견되지하지만 IRIX의 하나가 아마보다 앞서 1996 년부터 패키지 -freadlink 1997 년을 . GNU는 추가 readlink2003 년에 그리고 있었다 -f처음부터.
Stéphane Chazelas

2
훌륭한 요약 감사합니다. 데비안이 GNU 변형으로 전환하도록 요청하는 더 좋은 버그는 bugs.debian.org/730779입니다 . 기존의 실제 경로 관리자 조차도 전환이 일어나기를 원합니다
Pádraig Brady

1
멋진 답변입니다. 의 RHEL 구현에 대한 참조 만 누락되었습니다 realpath. readlink -f버전 과 어떻게 다른지 아는 사람이 있습니까?
Felipe Leão

1
@ StéphaneChazelas 오 와우, 실제로 내 답변에 많은 오류가 있습니다. 지적 해 주셔서 감사합니다. 정답을 올릴 수 있습니까? 삭제하겠습니다. (그렇지 않으면 오류를 수정하지만 긴 할 일 목록을 확인하는 것이 더 많은 작업입니다…)
Gilles

17

tl; dr 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

가용성

readlink대부분의 Linux 배포판에 설치됩니다. 반면, realpath종종 명시 적으로 설치해야합니다.

요약하자면

호출을 바꾸려면 realpath ...을 사용하십시오 readlink -e ....


Ubuntu 16에서 readlink (GNU coreutils) 8.21realpath 버전 1.19로 테스트되었습니다 .

( Ed .: @AnthonyGeoghegan은 " 이것은 데비안 버전을 말한다 realpath. GNU 버전은realpathreadlink -f " 와 동일하게 동작한다 ")


3
나는이 답변을 찬성했지만 이것이 데비안 버전의임을 나타냅니다 realpath. GNU 버전 realpath은와 동일하게 동작합니다 readlink -f.
Anthony Geoghegan

2
MacOS High Sierra에서 작동하지 않는지 확인할 수 있습니다.
Pred
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.