sbcl определяет, является ли символическая ссылка
Как я могу проверить, является ли путь символической ссылкой в sbcl?
CL-USER> (apropos "syml" )
:CLASSIFY-SYMLINKS (bound)
:RESOLVE-SYMLINKS (bound)
:SYMLINK (bound)
SB-IMPL::CLASSIFY-SYMLINKS
SB-IMPL::RESOLVE-PROBLEMATIC-SYMLINK
SB-IMPL::RESOLVE-SYMLINKS
SB-POSIX:SYMLINK (fbound)
UIOP/FILESYSTEM:*RESOLVE-SYMLINKS* (bound)
UIOP/FILESYSTEM:RESOLVE-SYMLINKS (fbound)
UIOP/FILESYSTEM:RESOLVE-SYMLINKS* (fbound)
UTIL::CLASSIFY-SYMLINKS
UTIL::SYMLINK
; No value
Ничто из этого не кажется полезным. classify-symlinks представляется ключевым словом.
2 ответа
TL;DR
(defun symlinkp (pathname)
(sb-posix:s-islnk (sb-posix:stat-mode (sb-posix:lstat pathname))))
Чтобы ответить на вопрос, нужно сначала спросить, как определить, является ли что-то (дескриптор файла, я полагаю) символической ссылкой в posix. Человек 2 стат на помощь. Из справочной страницы
lstat () идентичен stat (), за исключением того, что если path является асимболической ссылкой, то сама ссылка является статовой, а не файлом, на который она ссылается.
Следующие макросы POSIX определены для проверки типа файла с помощью поля st_mode:
S_ISLNK (м) символическая ссылка? (Не в POSIX.1-1996.)
Осикат имеет функцию
file-kind
который может обнаруживать символические ссылки:
(ql:quickload "osicat")
(equalp :symbolic-link (osicat:file-kind "/some/path"))
Обновление: эта функция содержит ошибки и не работает, если вы используете
"/some/path/"
. (Обратите внимание на косую черту в конце.)