Почему команда tree помечает символическую ссылку как рекурсивную?

Почему команда tree помечает символическую ссылку как рекурсивную?

У меня есть следующее дерево каталогов:

.
└── aaa
    └── bbb
        └── ccc

И создайте символическую ссылку:

ln -s ~/test/aaa/bbb slink

После этого я запускаю команду tree:

tree -l

и посмотреть

.
├── aaa
│   └── bbb
│       └── ccc
└── slink -> /home/kaa/test/aaa/bbb  [recursive, not followed]

Почему slink помечен как рекурсивный? Это баг или я что-то не понимаю?

решение1

Вы использовали -lопцию:

Следует символическим ссылкам, если они указывают на каталоги, как если бы они были каталогами. Символические ссылки, которые приведут к рекурсии, избегаются при обнаружении.

Итак, причина, по которой он печатает это предупреждение, заключается не в том, что онна самом делеrecurse. Мы ясно видим, что это просто перечислит bbb/cccдерево еще раз.

Соответствующий код:здесь, кстати. Если номер инода каталога, на который указывает символическая ссылка, найден в хэш-таблице (той, которая заполнена 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

Связанный контент