호기심에 다음 명령을 실행했습니다.
mkdir haha
cd haha
ln -s ../haha haha
그러면 다음과 같은 재귀 구조가 생성됩니다.
┌────────┐
V │
haha/ │
haha/────┘
나는 얼마나 멀리 갈 수 있는지 알고 싶었기 때문에 입력 cd haha/
하고 누른 상태 Tab에서 bash가 여러 haha/
s를 자동 완성하도록 했습니다. 가장 많은 부분 cd haha/haha/<SNIP>/haha/
(총 40 "하하/")을 자동 완성한 다음 갑자기 완료를 멈춥니다(이상한 동작 #1). 나는 를 눌렀다 Enter. 그것을 실행한 후에 pwd
나는 실제로 그 디렉토리 /home/me/haha/<SNIP>/haha/haha
(41 "haha/"s)에 있다는 것을 알았습니다. 이 디렉토리에서 또 다른 디렉토리를 실행했는데 cd haha
갑자기 저를 완전히 뒤로 순간이동시켰습니다 /home/me/haha
(다른 디렉토리에서 확인한 바와 같이 pwd
). 아? 왜 이런 일이 발생합니까? bash의 특징입니까? 파일 시스템 제한 사항(btrfs를 사용하고 있음)? 다른 건 없나요?
답변1
이 작업을 수행 cd haha/haha/...
하거나 실제로 경로 심볼릭 링크를 사용하는 경우 커널은 경로가 가리키는 위치를 찾기 위해 링크를 구문 분석해야 합니다. Linux에서는 ELOOP(Excessive Levels of Symbolic Links)를 사용하여 복구하기 전에 확인할 수 있는 링크 수에 제한이 있습니다.
이것path_solution(7) 매뉴얼 페이지40개 링크 제한에 대해 언급:
스택 오버플로로부터 커널을 보호하고 서비스 거부를 방지하기 위해 최대 재귀 깊이와 따라오는 최대 심볼릭 링크 수에 제한이 있습니다. 최대값을 초과하면 ELOOP 오류("심볼릭 링크 수준이 너무 많습니다")가 반환됩니다.
[...] Linux 4.2에서는 재귀 사용을 제거하기 위해 커널의 경로 이름 구문 분석 코드가 재설계되었으므로 남은 제한은 전체 경로 이름에 대한 최대 해상도 40입니다.
탭 완성을 반복하면 어떤 시점에서 운영 체제가 재생을 거부하고 오류를 던질 때까지 쉘이 디렉토리 목록 등을 요청하는 일 haha/
이 haha/haha/
발생합니다 . 탭 완료 루틴이 사용자에게 오류를 노출하지 않는 것 같습니다. 아마도 너무 시끄럽지 않을 것입니다. cd haha/...
너무 긴 경로를 사용 하려고 하면 오류 메시지가 표시됩니다. 그러나 한계 바로 아래의 경로에서는 작동합니다.
기본적으로 쉘은 pwd
링크와 함께 경로를 표시할 수 있도록 디렉토리에 액세스하는 데 사용한 경로를 기억하려고 시도하며, 그렇게 하면 링크인지 여부에 관계없이 cd foo; cd ..
시작한 곳으로 돌아갈 수 있습니다 .foo
제한에 도달하면 작업을 수행하면 cd haha
Bash가 먼저 chdir(".../haha/haha")
사용 됩니다.모두Path, 현재 링크가 너무 많아서 호출이 실패합니다. 그 후, 쉘은 화려하게 노력하는 대신 chdir("haha")
현재 위치 구문 분석을 호출하고 사용하여 getcwd()
링크가 없는 경로를 얻습니다.