У меня есть имя каталога (в виде строки) с тильдой: ~/projects
.
Я хочу получить полный путь: /home/user/projects
. Как я могу это сделать ?
Цель состоит в том, чтобы передать его uiop:run-program
, но это не совсем правильно©.
С этим ответом: Как перевести (make-pathname : directory '(:absolute :home directoryiwant) в абсолютный путь
(merge-pathnames
(make-pathname
:directory '(:relative "~/projects"))
(user-homedir-pathname))
#P"/home/me/~/projects/"
=> НЕПРАВИЛЬНО
Спасибо.
изменить я расскажу больше о контексте.
Я хотел запустить программу через uiop:launch-program
. У меня был определяемый пользователем список каталогов, например ~/projects
. С его помощью создается каталог ./~/projects
вместо /home/user/projects
.
truename
не работает, если каталог не существует.
В SBCL (namestring "~/doesntexist")
также возвращает свою тильду.
merge-pathnames
не сработало, все еще проблема с тильдой.
Кормление ensure-directories-exist
этим результатом создало каталог с именем ~
.
Учитывая ответы, у меня не было другого выбора, кроме как адаптировать логику для расширения имени каталога, который мы действительно хотим существовать.
;; Create a directory
;; Ensure its name (string) ends with a slash.
(setf mydir
(str:concat (string-right-trim (list #\/) mydir)
"/"))
(ensure-directories-exist base)
Тогда я мог бы использовать его truename
.
rm '~/foo.txt'
, он будет искать файл в каталоге с именем~
— поэтому обычно ожидается, что приложения просто не будут попытаться поместить это в -объем. - person Charles Duffy   schedule 18.09.2019