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.