Почему команда дерева помечает символическую ссылку как рекурсивную?
У меня есть следующее дерево каталогов:
.
└── aaa
└── bbb
└── ccc
И создайте символическую ссылку:
ln -s ~/test/aaa/bbb slink
После этого я запускаю команду дерева:
tree -l
и посмотреть
.
├── aaa
│ └── bbb
│ └── ccc
└── slink -> /home/kaa/test/aaa/bbb [recursive, not followed]
Почему слинк помечен как рекурсивный? Это ошибка или я что-то недопонимаю?
1 ответ
Вы использовали -l
опция:
Переходит по символическим ссылкам, если они указывают на каталоги, как если бы они были каталогами. Символьные ссылки, которые приведут к рекурсии, избегаются при обнаружении.
Теперь, причина, по которой оно печатает это предупреждение, не в том, что оно на самом деле повторяется. Мы можем ясно видеть, что это будет просто перечислить bbb/ccc
опять дерево
Я предполагаю, что настоящая проблема - это проблема остановки : tree
Команда не может знать, будет ли она бесконечно повторяться или нет, поэтому она должна прекратить уже, когда она обнаруживает символическую ссылку на каталог, который она уже посетила, даже если следование по этому каталогу просто напечатает поддерево, а не завершится.
Даже если вы можете остановить рано или после заранее определенного числа рекурсий, все это делается для того, чтобы не использовать бесконечное количество памяти. По крайней мере, это моя интерпретация.
Соответствующий код здесь , кстати. Если в хэш-таблице находится тот номер индекса каталога, на который указывает символическая ссылка (который заполняется saveino
а также findino
), он просто пропустит это.