Я не полностью понимаю то, что Вы спрашиваете. Если я не знал ничего лучшего, я думаю, что Вы спрашивали, был ли способ обнаружить это в то время как посреди контакта с файлом. Я не полагаю, что это возможно.
Единственный метод, из которого я могу забеременеть, делает находку, где Вы конкретно начинаете просматривать конкретное ответвление в дереве каталогов.
$ tree
.
`-- a
`-- b
|-- c
| `-- d
| `-- e -> ../../../../a/b
`-- e -> e
5 directories, 1 file
find
команда обнаружит этот цикл, но не действительно скажет Вам много об этом.
$ find -L . -mindepth 15
find: File system loop detected; `./a/b/c/d/e' is part of the same file system loop as `./a/b'.
find: `./a/b/e': Too many levels of symbolic links
Я произвольно выбрал 15 уровней, чтобы заблокировать любой вывод, отображаемый find
. Можно однако отбросить тот переключатель (-mindepth
) если Вы не заботитесь об отображаемом дереве каталогов. find
команда все еще обнаруживает цикл и остановки:
$ find -L .
.
./a
./a/b
./a/b/c
./a/b/c/d
find: File system loop detected; `./a/b/c/d/e' is part of the same file system loop as `./a/b'.
find: `./a/b/e': Too many levels of symbolic links
Кстати, если Вы хотите переопределить значение по умолчанию MAXSYMLINKS
который является, по-видимому, 40 на Linux (более новый 3.x версии ядра), Вы видите это названные Вопросы и ответы U&L: Как Вы увеличиваете MAXSYMLINKS.
Существует инструмент, который специалисты по обслуживанию FTP-сайта могли использовать названный symlinks
который поможет выставить проблемы с инструментом долго или повисшими деревьями, которые были вызваны символьными ссылками.
В определенных случаях symlinks
инструмент мог использоваться для удаления предлагаемых каналов также.
$ symlinks -srv a
lengthy: /home/saml/tst/99159/a/b/c/d/e -> ../../../../a/b
dangling: /home/saml/tst/99159/a/b/e -> e
glibc библиотека надеется предлагать некоторые функции C вокруг этого, но я не полностью знаю их роли или как на самом деле использовать их. Таким образом, я могу только просто указать на них Вам.
Страница справочника, man symlink
показывает функциональное определение для вызванной функции symlink()
. Описание идет как это:
символьная ссылка () создает символьную ссылку, названную newpath, который содержит строку oldpath.
Одно из состояний ошибки, которые возвращает эта функция:
С ELOOP Слишком много символьных ссылок встретились в разрешении newpath.
Я также направлю Вас к странице справочника, man path_resolution
который обсуждает, как Unix определяет пути к объектам на диске. Конкретно этот абзац.
If the component is found and is a symbolic link (symlink), we first
resolve this symbolic link (with the current lookup directory as starting
lookup directory). Upon error, that error is returned. If the result is
not a directory, an ENOTDIR error is returned. If the resolution of the
symlink is successful and returns a directory, we set the current lookup
directory to that directory, and go to the next component. Note that the
resolution process here involves recursion. In order to protect the
kernel against stack overflow, and also to protect against denial of
service, there are limits on the maximum recursion depth, and on the maximum
number of symbolic links followed. An ELOOP error is returned when the
maximum is exceeded ("Too many levels of symbolic links").
(здесь предполагается, что пути не содержат [1173679]|[1173680] символов).[1173212].
Скрипт читает из [1173681]stdin[1173682] и печатает на stdout. Он также ожидает, что входные данные будут соответствовать определённому формату. Если у вас есть строки, которые не соответствуют этому формату, вам придется настроить скрипт: