coreutils 매뉴얼에서ln
현재 디렉토리가 아닌 다른 위치에 상대 심볼릭 링크를 생성하는 경우,심볼릭 링크 해결와는 다를 것이다현재 디렉터리에서 동일한 문자열 구문 분석. 따라서 많은 사용자는 먼저 상대 심볼릭 링크가 생성될 위치로 디렉터리를 변경하는 것을 선호합니다. 탭 완성 또는 기타 파일 구문 분석심볼릭 링크에 있는 것과 동일한 대상을 찾습니다.
상대 심볼릭 링크에 저장된 문자열은 전적으로 명령줄 인수로 지정된 소스 및 대상 경로 이름에 의해 결정됩니다 ln
.
현재 디렉토리가 어떻게 관련되어 있는지 이해하지 못합니다. 그래서 많은 사용자가 현재 디렉토리를 생성하기 전에 생성하려는 상대 심볼릭 링크의 상위 디렉토리로 변경하려는 이유를 잘 이해하지 못합니다. 다른 말로 바꾸거나 몇 가지 예를 들어주실 수 있나요? 감사해요.
답변1
기억해야 할 두 가지 사항이 있습니다.
ln -s
(없이-r
) 저장 대상 이름당신이 그것을 통과할 때- 상대 대상을 전달하면 해결됩니다.링크 이름 기준,아니요현재 작업 디렉토리
예:
저는 가입했고 /home/user/d0
링크를 원해서 /home/user/file
다음과 같이 합니다:
ln -s ../file .
../file
의 유효한 경로입니다 d0
.
d1
이제 하위 디렉터리 ( ) 가 있고 /home/user/d0/d1
디렉터리를 변경하지 않고 ../file
( )에 대한 링크를 넣으려면 /home/user/file
다음을 수행해야 합니다.
ln -s ../../file d1/
상대 경로가 다음과 같아야 하기 때문입니다.링크 이름 기준, 현재 작업 디렉토리가 아닙니다. (아마도) (이라는 파일이 없는 한 ) ../../file
과 관련된 모든 것을 해결하므로 자동 완성 기능이 제공되지 않아 오류가 발생하기 쉽습니다.d0
/home/file
그래서 나는 d1
첫 번째로 변경했습니다.
cd d1
ln -s ../../file .
이제 ../../file
현재 디렉토리와 링크 이름 모두 의미가 있으며 자동 완성이 시작되고 내 이름이 정확하다고 확신합니다.
GNU에는 이러한 상대 경로를 수동으로 작성할 필요가 없도록 하여 이를 더 쉽게 만드는 플래그가 ln
있습니다 . --relative|-r
이를 사용하면 현재 디렉터리에 대한 상대 경로나 절대 경로를 사용할 수 있으며 필요에 따라 링크 이름을 기준으로 상대화됩니다.
답변2
당신이 그렇게한다면
mkdir /tmp/foo
ln -s ../../etc/passwd /tmp/foo
그러면 액세스가 다음 /tmp/foo/passwd
으로 변환됩니다 ./tmp/foo/../../etc/passwd
/etc/passwd
당신이 그렇게한다면
mkdir /var/tmp/foo
ln -s ../../etc/passwd /var/tmp/foo
그러면 액세스가 다음 /var/tmp/foo/passwd
으로 변환됩니다 ./var/tmp/foo/../../etc/passwd
/var/etc/passwd
그러면 링크가 어디에 저장되어 있는지에 따라 "상대 심볼릭 링크 경로"가 다르게 해결되는 것을 볼 수 있습니다. 명령을 실행 중인 현재 디렉터리 ln
는 전혀 관련되지 않습니다.
이러한 혼란을 피하기 위해 일부 사용자는 심볼릭 링크를 만들기 전에 현재 디렉터리를 변경합니다.
mkdir /tmp/foo
cd /tmp/foo
ln -s ../../etc/passwd
답변3
너가 확실히 맞아. 심볼릭 링크의 내용은 정확히 명령에 지정된 내용입니다. 그러나 매뉴얼에서는 심볼릭 링크가 링크 위치에 따라 해석될 것이라고 말하고 있으므로 사용자는 링크를 올바르게 설정하도록 주의해야 합니다.
예를 들어:
/tmp/test$ mkdir bar
/tmp/test$ ls -l foo/aaa
-rw-r--r-- 1 itvirta itvirta 0 Jul 4 00:37 foo/aaa
/tmp/test$ ln -si foo/aaa bar/
파일은 정확히 우리가 생각하는 곳에 있으므로 링크가 이제 작동할 것이라고 가정할 수도 있습니다. 하지만 링크는 내가 링크를 만들었을 때 있었던 위치가 아닌 해당 위치를 기준으로 해석되기 때문에 그렇지 않습니다.
/tmp/test$ cat bar/aaa
cat: bar/aaa: No such file or directory
링크를 생성하기 전에 대상 디렉토리로 이동하면 혼동되지 않을 것입니다.
/tmp/test$ cd bar
/tmp/test/bar$ ls -l ../foo/aaa
-rw-r--r-- 1 itvirta itvirta 0 Jul 4 00:37 ../foo/aaa
/tmp/test/bar$ ln -si ../foo/aaa .
그러나 더 혼란스러운 점은 하드 링크를 생성할 때 심볼릭 링크를 생성하는 확실한 방법이 작동하지 않는 것과 똑같은 방식으로 대상 파일을 가리킨다는 것입니다.
/tmp/test$ ln foo/aaa bar/
기호 링크는 거의 모든 것과 마찬가지로 파일 식별자(inode)가 아닌 이름으로 가리키기 때문에 여기서 주의해야 합니다. 먼저 대상 디렉터리로 이동하면 두 시나리오가 정렬되고 인적 오류가 발생할 가능성이 줄어듭니다.
답변4
입력하면 링크 비트가 설정된 새 파일 mno/xyz에 ln -sT abc/fgh mno/xyz
저장됩니다 . abc/fgh
당신이 볼 때, mno/xyz
당신은 실제로 mno/abc/fgh
. 링크를 생성하거나 사용할 때 어느 디렉토리에 있는지는 (당신이 말했듯이) 중요하지 않습니다.
하지만:
상대 심볼릭 링크가 생성될 위치로 디렉토리를 변경하여 이를 생성할 때의 관점과 사용할 때의 관점이 동일하도록 합니다. 이렇게 하면 혼란이 줄어듭니다. 또한 탭 완성을 사용하면 더 쉬워집니다. 그렇지 않으면 탭 완성이 작동하지 않기 때문입니다.