symlink의 대상이 대상의 상위 디렉토리를 기준으로합니까? 그렇다면 그 이유는 무엇입니까?


14

다음과 같은 파일 구조가 있습니다.

build/
client/
  –> index.js

그리고 cwd의 클라이언트 디렉토리를 참조하는 빌드 디렉토리 내에 "client"라는 기호 링크를 작성하려고 할 때

// Fails
$ pwd
/home/user/
$ ln -s client build/client 
$ stat build/client/index.js
stat: build/client/index.js: stat: Too many levels of symbolic links

위에 ELOOP 오류가 표시됩니다. 대상 경로를 대상 경로를 기준으로 변경하면 모두 좋습니다.

// Works
$ pwd
/home/user/
$ ln -s ../client build/client 
$ stat build/client/index.js
stat: <outputs file stats>

이것이 의도 된 동작입니까? 이유를 설명하십시오.


이것은 아마도 ../를 사용하여 상대 경로 대신 경로를 선언하는 절대 경로를 사용하는 것과 관련이 있습니다. 좋은
— 실천

대상과 대상 모두에 항상 절대 경로를 사용했기 때문에 모범 사례에 동의합니다. 그러나 매뉴얼 페이지에는 상대 경로를 모두 사용할 수 있다고 명시되어 있습니다.
— jibsales

답변:


13

작동하지 않는 제품의 경우 ls -l결과를 보면 다음과 같은 결과가 나타납니다.

[sparticvs@sparta test]$ ls -l build/
total 0
lrwxrwxrwx. 1 sparticvs sparticvs 6 Dec 17 16:08 client -> client

이제 무슨 일이 일어나고 있는지 이해합니다. 호출 한 명령을 살펴 보자.

ln -s client build/client

매뉴얼 페이지에 따르면이 형식에 대해 두 가지 가능한 일치 항목이 있습니다

SYNOPSIS
       ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
       ln [OPTION]... TARGET... DIRECTORY     (3rd form)

첫 번째 형식부터 일치합니다. 이제 "대상 이름"또는 client귀하의 경우 (완전한 ln매뉴얼 에 따라 ) 임의의 문자열이 될 수 있습니다 . 그들은 지금 당장 무언가를 해결할 필요는 없지만 장래에 무언가를 해결할 수 있습니다. 호출로 작성하는 것은 "매달린 심볼릭 링크"이며 시스템은이를 작성하지 못하게합니다.

이제 두 번째 호출 ln -s ../client build/client은 "상대적 링크"라고합니다 (자신의 게시물에서 언급 한대로). 두 번째 유형이 있으며이를 수행하여 호출되는 "절대 심볼릭 링크"입니다 ln -s /home/user/client build/client.

이것은 버그 가 아닙니다 . 매뉴얼에 따르면 :

현재 디렉토리와 다른 위치에 상대적인 심볼릭 링크를 만들 때 심볼릭 링크의 해상도는 현재 디렉토리와 동일한 문자열의 해상도와 다릅니다. 따라서 많은 사용자가 먼저 상대 symlink가 작성 될 위치로 디렉토리를 변경하는 것을 선호하므로 탭 완성 또는 기타 파일 해상도가 symlink에 배치 될 대상과 동일한 대상을 찾을 수 있습니다.

-부터 info coreutils 'ln invocation'

그것은 당신이 말했다 해야 대상에 상대 또는 절대 경로 중 하나를 사용하십시오.


5

이것은 실제로 의도 된 동작입니다. 로부터 ln(1)매뉴얼 페이지

심볼릭 링크는 임의의 텍스트를 보유 할 수 있습니다. 나중에 해결되면 상대 링크는 상위 디렉토리와 관련하여 해석됩니다.

그 이유에 대해 심볼릭 링크가 대신 대상이 아닌 소스를 기준으로 해석되는지 상상해보십시오. 나중에 해결할 때 CWD를 만들 때 CWD가 무엇인지 알아야합니다. 이는 무의미하지만 불가능합니다.

또한이 방법을 사용하면 심볼릭 링크를 끊지 않고 디렉토리 트리의 아무 곳에 나 놓을 수있는 스켈레톤 디렉토리 구조를 만드는 깔끔하고 간결한 방법을 얻을 수 있습니다.

내가 의미하는 바의 예를 들기 위해 프로젝트를 진행 중이며 전체 디렉토리 구조가 다음과 같이 설정되어 있다고 가정 해 봅시다.

$ ls -1 /home/you/project
thingummies/
widgets/
wizardry/

이제 widgets/inside에 대한 심볼릭 링크를 만들고 싶다고 가정하십시오 wizardry/. 두 가지 옵션이 있습니다.

$ ln -s /home/you/project/widgets /home/you/project/wizardry

또는

$ ln -s ../widgets /home/you/project/wizardry

그런 다음 /home/you/project다른 곳으로 이동 하면 첫 번째 양식으로 작성된 심볼릭 링크가 찾고 있기 때문에 중단됩니다 /home/you/project/widgets. 두 번째 형식은 해당 위치가 디렉토리 트리의 위치에 관계없이 해당 위치 를 ../widgets 기준으로 검색 하기 때문에 심볼릭 링크 기능을 유지합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.