기호 링크 수준이 너무 많습니다.

기호 링크 수준이 너무 많습니다.

나는 다음과 같은 파일 구조를 만들었습니다.

test/src
test/firefox

이 명령을 실행할 때:

ln -s test/src test/firefox

test/firefox/src에 대한 심볼릭 링크를 만들고 싶지만 test/src다음 오류가 발생합니다.

-bash: cd: src: Too many levels of symbolic links
  • 내가 뭘 잘못했나요?
  • 해당 폴더의 형제 폴더에 저장된 폴더에 대한 심볼릭 링크를 만들 수 없습니까?
  • 점은 무엇인가?

답변1

Dubu가 의견에서 지적했듯이 문제는 상대 경로입니다. NET에서 nginx 구성을 심볼릭 링크할 /usr/local/etc/nginx때 비슷한 문제가 발생했습니다 /etc/nginx. 다음과 같이 심볼릭 링크를 생성하면:

cd /usr/local/etc
ln -s nginx/ /etc/nginx

실제로 소스 경로가 링크 경로에 상대적이기 때문에 /etc/nginx -> /etc/nginx 링크를 생성하게 됩니다. 해결책은 절대 경로를 사용하는 것만큼 간단합니다.

ln -s /usr/local/etc/nginx /etc/nginx

상대 경로를 사용하고 예상대로 작동하도록 하려면 $PWD다음과 같이 이 변수를 사용하여 현재 작업 디렉터리 경로에 경로를 쉽게 추가할 수 있습니다.

cd /usr/local/etc
ln -s "$PWD/nginx/" /etc/nginx

현재 경로의 공백 등이 이스케이프되도록 경로를 큰따옴표로 묶어야 합니다. $PWD작은따옴표를 사용하면 대체되지 않으므로 이 작업을 수행할 때 큰따옴표를 사용해야 합니다 .

답변2

표면적으로는 당신이 시도해 보라고 제안한 것이 나에게 효과적입니다.

$ mkdir -p test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    `-- [drwxrwxr-x]  ./test/src

심볼릭 링크를 생성합니다:

$ ln -s test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    |   `-- [lrwxrwxrwx]  ./test/firefox/src -> test/src
    `-- [drwxrwxr-x]  ./test/src

두 번째로 실행하면 일반적으로 다음과 같은 결과가 생성됩니다.

$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists

그래서 다른 일이 일어날 수도 있습니다. 링크가 자신을 가리키는 순환 참조가 있는 것 같습니다.

find다음 방법을 사용하여 조사를 수행 할 수 있습니다 .

$ cd /suspected/directory
$ find -L ./ -mindepth 15

답변3

심볼릭 링크는 프로세스의 현재 디렉토리가 아닌 링크의 상위 디렉토리를 기준으로 합니다 ln.

이 작업을 수행할 때:

cd /top/dir
ln -s test/src test/firefox

( test/firefox디렉토리는 어디에 있습니까?) test/firefox/src에 대한 대상을 생성하고 있습니다 test/src.

이는 디렉토리 test/src에 상대적이므로 test/firefoxto 입니다 /top/dir/test/firefox/test/src.

심볼릭 링크를 에 대한 링크로 만들려면 /top/dir/test/src다음을 작성해야 합니다.

ln -s ../src test/firefox/

또는

ln -s /top/dir/test/src test/firefox/

절대 경로를 사용하여 심볼릭 링크를 생성하는 것은 일반적으로 좋지 않은 생각입니다. 디렉터리 이름이 바뀌거나 파일 시스템이 다른 곳에 마운트되면 쉽게 손상될 수 있기 때문입니다.

GNU에서는 옵션을 사용하여 스스로 계산을 수행하도록 ln할 수 있습니다 .-r

$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src

답변4

대답은 절대 경로를 사용하는 것입니다. 그러나 현재 디렉터리에 있는 항목의 전체 경로를 입력하는 것은 성가실 수 있습니다. 이러한 상황을 방지하려면 pwd 명령 대체를 사용할 수 있습니다. 대상이 현재 디렉터리에 있는 경우:

ln -s "$(pwd)"/target abs/path/to/link 

링크가 현재 디렉터리에 있어야 하는 경우:

ln -s /abs/path/to/target "$(pwd)"

관련 정보