다음과 같은 디렉토리 트리가 있습니다.
.
└── aaa
└── bbb
└── ccc
그리고 심볼릭 링크를 만듭니다:
ln -s ~/test/aaa/bbb slink
그런 다음 tree 명령을 실행합니다.
tree -l
그리고 봐라
.
├── aaa
│ └── bbb
│ └── ccc
└── slink -> /home/kaa/test/aaa/bbb [recursive, not followed]
슬링크가 재귀적으로 표시된 이유는 무엇입니까? 버그인가요 아니면 제가 뭔가 잘못 이해하고 있는 건가요?
답변1
다음 옵션 을 사용했습니다 -l
.
디렉토리를 가리키는 경우 마치 디렉토리인 것처럼 기호 링크를 따릅니다. 재귀를 발생시키는 기호 링크가 감지되면 방지됩니다.
이제 이 경고를 인쇄하는 이유는실제로재발. 우리는 이것이 단순히 bbb/ccc
트리를 다시 나열한다는 것을 분명히 알 수 있습니다.
해당 코드는여기, 그런데. 심볼릭 링크가 가리키는 디렉토리의 inode 번호가 해시 테이블( saveino
및 로 채워진 테이블 findino
)에서 발견되면 간단히 건너뜁니다.
답변2
문서가 부정확하다고 생각합니다. 문서에 따르면
다음과 같은 심볼릭 링크가 발생합니다.재귀감지되면 회피됨
하지만 다음과 같이 말해야 합니다
다음과 같은 심볼릭 링크가 발생합니다.이미 방문한 디렉토리따르지 않는다
보다오류 메시지 위치tree.c
그리고
기능 findino
하다hash.c
.
tree -l
방문한 디렉토리를 기억하고 해당 디렉토리로만 내려갑니다.연결아직 방문하지 않은 타겟:
( mkdir test1 && cd test1 && mkdir -p a/b && ln -s a link && tree -l; )
.
├── a
│ └── b
└── link -> a [recursive, not followed]
이미 방문한 디렉토리를 무시하는 것은 다음 경우에만 수행됩니다.연결.진짜디렉토리는 항상 방문됩니다. 이는 다음을 의미합니다.순회 순서가 중요하다. 정확히 동일한 트리를 알파벳 역순( -r
)으로 순회하면 링크를 따라갑니다. 왜냐하면 대상이 아직 방문되지 않은 시간에 링크를 방문하기 때문입니다.
( cd test1 && tree -r -l; )
.
├── link -> a
│ └── b
└── a
└── b
이 동작을 재현하기 위한 두 가지 대안은 다음과 같습니다.
( -I
) 디렉토리를 무시 a/
하여 링크 방문 시 해당 디렉토리를 방문하지 않도록 합니다.
( cd test1 && tree -l -I a; )
.
└── link -> a
└── b
링크가 자연스럽게 먼저 방문되도록 디렉토리와 링크의 이름을 지정하십시오.
( mkdir test2 && cd test2 && mkdir -p x/y && ln -s x link && tree -l; )
.
├── link -> x
│ └── y
└── x
└── y